在2012年WWDC的一次演讲中(《精通自动布局的最佳实践》),演讲者说您可以在Xcode中设置UIView标识符来帮助调试自动布局:
这似乎是一个非常好的主意,但在我的iOS项目的Xcode 4.5.1中,我无法找到设置UIView身份的方法。
我如何在Xcode 4.5.1中设置UIView的标识?如果在iOS项目中无法实现此功能,该如何获得相同的功能?
在2012年WWDC的一次演讲中(《精通自动布局的最佳实践》),演讲者说您可以在Xcode中设置UIView标识符来帮助调试自动布局:
这似乎是一个非常好的主意,但在我的iOS项目的Xcode 4.5.1中,我无法找到设置UIView身份的方法。
我如何在Xcode 4.5.1中设置UIView的标识?如果在iOS项目中无法实现此功能,该如何获得相同的功能?
在 UIView
上设置 accessibilityIdentifier
即可实现此功能。在 Xcode 6.4、iOS 8.4 上进行了测试。
找到有问题的约束。
要获取影响特定视图的约束,请使用constraintsAffectingLayoutForOrientation:。然后可以在调试器中检查约束。它们使用可视化格式符打印出来。如果您的视图具有标识符(请参阅标识符(NSView)),则会在描述中使用标识符打印出来,如下所示:
imageView.accessibilityIdentifier = "profileImageView"
输出:
<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40 (active, names: profileImageView:0x10fd48110 )>
很遗憾,目前似乎没有任何方法可以实现这一点。我已经尝试填写几乎所有的内容,但都没有效果。无论是恢复ID还是可访问性特征对此都没有影响。如果您查看屏幕截图,您会发现实际上他正在设置一个具有标识符属性的NSView。
不完全是你要找的答案,但在调试器中做类似这样的事情会很有帮助:
expr [(UIButton*)0x12345 setBackgroundColor:[UIColor purpleColor]]
这有助于识别视图。但请确保在调试器上点击运行以查看其生效。
这里有个方便的技巧,可以帮助您进行AutoLayout调试。 您可以通过类别向UIView
添加自己的name
属性,并重载其description
方法以包含您的新name
。 这不会在AutoLayout调试信息中提供可见名称,但让您可以轻松地通过其地址po
视图并查看其给定名称。
然后只需在您的视图控制器中分配适用的名称即可:
- (void)viewDidLoad {
[super viewDidLoad];
self.firstView.name = @"MyViewController.firstView";
self.secondView.name = @"MyViewController.secondView";
}
现在当你看到这样的东西:
<NSAutoresizingMaskLayoutConstraint:0x175086220 h=-&- v=-&- UIView:0x147533250.height == UIView:0x14760b4a0.height>
您可以直接使用po
来处理视图地址:
po 0x147533250
MyViewController.firstView <UIView: 0x147533250>
po 0x14760b4a0
MyViewController.secondView <UIView: 0x14760b4a0>
这是类别代码:
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
不要使用标识符
,而是使用Storyboard
ID字段。它们是一样的。