2012-10-18 14 views
21

Trong một cuộc nói chuyện từ WWDC 2012 (Best Practices cho Mastering Auto Layout), người dẫn chương trình nói rằng bạn có thể thiết lập một định danh UIView trong Xcode để hỗ trợ trong gỡ lỗi bố trí tự động:Làm cách nào để đặt Mã định danh của UIView trong Xcode 4.5/iOS để gỡ lỗi bố cục tự động?

Identifier for UIView

Điều này có vẻ giống như một thực sự ý tưởng hay, nhưng trong Xcode 4.5.1 cho dự án iOS của tôi, không có cách nào mà tôi có thể thấy để thiết lập Identity of a UIView.

Làm thế nào tôi có thể thiết lập các Identity của một UIView trong Xcode 4.5.1? Nếu điều này là không thể trong các dự án iOS, làm thế nào tôi có thể nhận được chức năng tương tự?

+1

Xem ở đây http: // stackoverflow. com/questions/8295471/storyboard-doesnt-chứa-một-view-controller-với-identifier –

+0

@Oleg này chỉ hoạt động cho ViewControllers. OP hỏi về các trường hợp của UIView theo ảnh chụp màn hình. – Fogmeister

Trả lời

-4

Thay vì Identifier, hãy sử dụng trường ID Storyboard. Nó là như nhau.

+0

Không có id bảng phân cảnh cho chế độ xem, chỉ dành cho bộ điều khiển chế độ xem –

2

Thật không may, dường như không có cách nào để thực hiện việc này. Tôi đã cố gắng lấp đầy gần như tất cả mọi thứ, và không có gì làm việc. Cả restorationId, cũng như các đặc điểm Khả năng truy cập đều không ảnh hưởng đến điều này. Nếu bạn nhìn vào ảnh chụp màn hình, bạn sẽ thấy rằng thực ra anh ta đang thiết lập một NSView, nó có thuộc tính định danh.

4

Có vẻ như Mã định danh chỉ khả dụng trên NSView chỉ trong Mac OSX. Nó không khả dụng trên UIView trong iOS.

Tìm các ràng buộc hoặc ràng buộc xấu.

Để nhận các ràng buộc ảnh hưởng đến một chế độ xem cụ thể, hãy sử dụng các ràng buộcAffectingLayoutForOrientation :. Sau đó bạn có thể kiểm tra các ràng buộc trong trình gỡ lỗi. Chúng được in bằng ký hiệu định dạng trực quan. Nếu quan điểm của bạn có định danh (xem định danh (NSView)), họ in ra bằng cách sử dụng nhận dạng trong mô tả, như thế này:

Như đã trình bày ở đây: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html

1

Không hẳn câu trả lời bạn đang tìm kiếm, nhưng những gì hữu ích là làm điều gì đó như thế này trong trình gỡ lỗi:

expr [(UIButton*)0x12345 setBackgroundColor:[UIColor purpleColor]] 

Điều này giúp xác định chế độ xem. Hãy chắc chắn để chạy chạy trên trình gỡ lỗi để xem nó có hiệu lực mặc dù.

0

Dưới đây là một mẹo tiện dụng mà bạn có thể thực hiện để hỗ trợ gỡ lỗi AutoLayout của mình. Bạn có thể thêm thuộc tính name của riêng mình vào UIView qua danh mục và quá tải phương thức description để bao gồm name mới. Điều này không hoàn toàn cung cấp cho bạn một tên hiển thị trong thông tin gỡ lỗi AutoLayout, nhưng cho phép bạn dễ dàng po một chế độ xem từ địa chỉ của nó và xem tên đã cho của nó.

Sau đó chỉ cần gán tên được áp dụng trong điều khiển điểm của bạn:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.firstView.name = @"MyViewController.firstView"; 
    self.secondView.name = @"MyViewController.secondView"; 
} 

Bây giờ khi bạn nhìn thấy một cái gì đó như thế này:

<NSAutoresizingMaskLayoutConstraint:0x175086220 h=-&- v=-&- UIView:0x147533250.height == UIView:0x14760b4a0.height> 

Bạn có thể chỉ po các địa chỉ xem:

po 0x147533250 
MyViewController.firstView <UIView: 0x147533250> 
po 0x14760b4a0 
MyViewController.secondView <UIView: 0x14760b4a0> 

Đây là mã danh mục:

UIView + Name.h

#import <UIKit/UIKit.h> 

@interface UIView (Name) 

@property (strong, nonatomic) NSString *name; 

- (NSString *)description; 

@end 

UIView + Name.m

#import "UIView+Name.h" 
#import <objc/runtime.h> 

@implementation UIView (Name) 

- (NSString *)name { 
    return objc_getAssociatedObject(self, @selector(name)); 
} 

- (void)setName:(NSString *)name { 
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (NSString *)description { 
    return [NSString stringWithFormat:@"%@ %@", self.name, [super description]]; 
} 

@end 
13

Thiết accessibilityIdentifier trên UIView hiện các trick. Thử nghiệm trên Xcode 6.4, iOS 8.4.

1

Setting trong mã, làm việc cho tôi:

đang:

imageView.accessibilityIdentifier = "profileImageView" 

đầu ra:

<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40 (active, names: profileImageView:0x10fd48110)>