30

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

UIView 的标识符

这似乎是一个非常好的主意,但在我的 iOS 项目的 Xcode 4.5.1 中,我看不到设置 UIView 的标识。

如何在 Xcode 4.5.1 中设置 UIView 的标识?如果这在 iOS 项目中是不可能的,我怎样才能获得相同的功能?

4

7 回答 7

22

设置accessibilityIdentifierUIView可以了。在 Xcode 6.4、iOS 8.4 上测试。

于 2015-07-02T17:08:02.520 回答
5

似乎标识符仅在 Mac OSX中的NSView上可用。它在 iOS 的 UIView 上不可用。

找到一个或多个坏约束。

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

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

于 2013-07-23T08:05:16.977 回答
2

不幸的是,似乎没有任何方法可以做到这一点。我已经尝试填充几乎所有东西,但没有任何效果。restoreId 和 Accessibility 特征都对此没有任何影响。如果您查看屏幕截图,您会看到实际上他正在设置一个 NSView,它确实具有标识符属性。

于 2013-03-04T16:50:12.913 回答
2

设置代码,为我工作:

代码

imageView.accessibilityIdentifier = "profileImageView"

输出

<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40   (active, names: profileImageView:0x10fd48110 )>
于 2017-07-10T15:58:25.100 回答
0

不是您正在寻找的答案,但有帮助的是在调试器中执行以下操作:

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

这有助于识别视图。确保在调试器上运行以查看它是否生效。

于 2014-03-20T00:33:29.207 回答
0

这是一个方便的技巧,可以帮助您进行 AutoLayout 调试。您可以通过类别添加自己的name属性,并重载其方法以包含您的新. 这并不能在 AutoLayout 调试信息中为您提供一个可见的名称,但可以让您轻松地从其地址查看并查看其给定名称。UIViewdescriptionnamepo

然后只需在视图控制器中分配适用的名称:

- (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
于 2015-05-19T19:15:14.310 回答
-5

代替Identifier,使用StoryboardID 字段。这是相同的。

于 2012-11-03T19:57:27.200 回答