在 WWDC 2012(掌握自动布局的最佳实践)的一次演讲中,演讲者说您可以在 Xcode 中设置 UIView 标识符来帮助调试自动布局:
这似乎是一个非常好的主意,但在我的 iOS 项目的 Xcode 4.5.1 中,我看不到设置 UIView 的标识。
如何在 Xcode 4.5.1 中设置 UIView 的标识?如果这在 iOS 项目中是不可能的,我怎样才能获得相同的功能?
在 WWDC 2012(掌握自动布局的最佳实践)的一次演讲中,演讲者说您可以在 Xcode 中设置 UIView 标识符来帮助调试自动布局:
这似乎是一个非常好的主意,但在我的 iOS 项目的 Xcode 4.5.1 中,我看不到设置 UIView 的标识。
如何在 Xcode 4.5.1 中设置 UIView 的标识?如果这在 iOS 项目中是不可能的,我怎样才能获得相同的功能?
设置accessibilityIdentifier
就UIView
可以了。在 Xcode 6.4、iOS 8.4 上测试。
似乎标识符仅在 Mac OSX中的NSView上可用。它在 iOS 的 UIView 上不可用。
找到一个或多个坏约束。
要获取影响特定视图的约束,请使用 constraintsAffectingLayoutForOrientation:。然后,您可以检查调试器中的约束。它们使用视觉格式符号打印。如果您的视图有标识符(请参阅标识符 (NSView)),它们会使用描述中的标识符打印出来,如下所示:
不幸的是,似乎没有任何方法可以做到这一点。我已经尝试填充几乎所有东西,但没有任何效果。restoreId 和 Accessibility 特征都对此没有任何影响。如果您查看屏幕截图,您会看到实际上他正在设置一个 NSView,它确实具有标识符属性。
设置代码,为我工作:
代码:
imageView.accessibilityIdentifier = "profileImageView"
输出:
<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40 (active, names: profileImageView:0x10fd48110 )>
不是您正在寻找的答案,但有帮助的是在调试器中执行以下操作:
expr [(UIButton*)0x12345 setBackgroundColor:[UIColor purpleColor]]
这有助于识别视图。确保在调试器上运行以查看它是否生效。
这是一个方便的技巧,可以帮助您进行 AutoLayout 调试。您可以通过类别添加自己的name
属性,并重载其方法以包含您的新. 这并不能在 AutoLayout 调试信息中为您提供一个可见的名称,但可以让您轻松地从其地址查看并查看其给定名称。UIView
description
name
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+名称.h
#import <UIKit/UIKit.h>
@interface UIView (Name)
@property (strong, nonatomic) NSString *name;
- (NSString *)description;
@end
UIView+名称.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
代替Identifier
,使用Storyboard
ID 字段。这是相同的。