【问题标题】:How to set the Identifier of a UIView in Xcode/iOS for debugging auto layout?如何在 Xcode/iOS 中设置 UIView 的标识符以调试自动布局?
【发布时间】:2012-10-09 12:32:59
【问题描述】:

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

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

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

【问题讨论】:

标签: ios xcode4.5 autolayout


【解决方案1】:

UIView 上设置accessibilityIdentifier 可以解决问题。在 Xcode 6.4、iOS 8.4 上测试。

【讨论】:

    【解决方案2】:

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

    找到一个或多个坏约束。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在代码中设置,对我有用:

        代码

        imageView.accessibilityIdentifier = "profileImageView"
        

        输出

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            这是一个方便的技巧,可以帮助您进行 AutoLayout 调试。您可以通过类别将自己的name 属性添加到UIView,并重载其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
            

            【讨论】:

              【解决方案7】:

              使用Storyboard ID 字段代替Identifier。是一样的。

              【讨论】:

              • 视图没有storyboard id,仅适用于视图控制器
              猜你喜欢
              • 2011-01-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-23
              • 1970-01-01
              • 2012-10-10
              相关资源
              最近更新 更多