如何在Xcode/iOS中为调试自动布局设置UIView的标识符?

31

在2012年WWDC的一次演讲中(《精通自动布局的最佳实践》),演讲者说您可以在Xcode中设置UIView标识符来帮助调试自动布局:

UIView的标识符

这似乎是一个非常好的主意,但在我的iOS项目的Xcode 4.5.1中,我无法找到设置UIView身份的方法。

我如何在Xcode 4.5.1中设置UIView的标识?如果在iOS项目中无法实现此功能,该如何获得相同的功能?


1
查看这里 https://dev59.com/fmsy5IYBdhLWcg3w0RXT - user1763582
@Oleg 这只适用于 ViewControllers。根据屏幕截图,OP 正在询问 UIView 的实例。 - Fogmeister
7个回答

23

UIView 上设置 accessibilityIdentifier 即可实现此功能。在 Xcode 6.4、iOS 8.4 上进行了测试。


5
似乎在Mac OSX上,Identifier只能在NSView上使用,而在iOS上的UIView上不可用。

找到有问题的约束。

要获取影响特定视图的约束,请使用constraintsAffectingLayoutForOrientation:。然后可以在调试器中检查约束。它们使用可视化格式符打印出来。如果您的视图具有标识符(请参阅标识符(NSView)),则会在描述中使用标识符打印出来,如下所示:

如此描述: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html


4
在代码中设置,对我有效: 代码:
imageView.accessibilityIdentifier = "profileImageView"

输出:

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

2

很遗憾,目前似乎没有任何方法可以实现这一点。我已经尝试填写几乎所有的内容,但都没有效果。无论是恢复ID还是可访问性特征对此都没有影响。如果您查看屏幕截图,您会发现实际上他正在设置一个具有标识符属性的NSView。


0

不完全是你要找的答案,但在调试器中做类似这样的事情会很有帮助:

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

这有助于识别视图。但请确保在调试器上点击运行以查看其生效。


0

这里有个方便的技巧,可以帮助您进行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

-5

不要使用标识符,而是使用Storyboard ID字段。它们是一样的。


视图没有故事板ID,只有视图控制器有。 - José Manuel Sánchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接