¿Cómo configurar el Identificador de una UIView en Xcode 4.5 / iOS para depurar el layout automático?

Durante una charla de WWDC 2012 (Mejores prácticas para dominar el layout automático), el presentador dijo que puede establecer un identificador UIView en Xcode para ayudar a depurar el layout automático:

Identificador para UIView

Esto parece una buena idea, pero en Xcode 4.5.1 para mi proyecto iOS, no hay forma de que pueda ver para configurar la identidad de una UIView.

¿Cómo puedo configurar la identidad de UIView en Xcode 4.5.1? Si esto no es posible en los proyectos de iOS, ¿cómo puedo get la misma funcionalidad?

Configurar accessibilityIdentifier en UIView hace el truco. Probado en Xcode 6.4, iOS 8.4.

Parece que Identificador solo está disponible en NSView en Mac OSX solamente. No está disponible en UIView en iOS.

Encuentra la restricción o las restricciones malas.

Para get las restricciones que afectan a una vista particular, use constraintsAffectingLayoutForOrientation :. A continuación, puede inspeccionar las restricciones en el depurador. Se imprimen con la notación de formatting visual. Si sus puntos de vista tienen identificadores (vea el identificador (NSView)) , se imprimen utilizando el identificador en la descripción, así:

Como se describe aquí: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html

Desafortunadamente, no parece haber ninguna forma de hacer esto. He intentado llenar casi todo, y nada funcionó. Ni restrationId, ni los rasgos de accesibilidad tienen ningún efecto en esto. Si miras la captura de pantalla, verás que realmente está configurando un NSView, que tiene la propiedad de identificador.

No es exactamente la respuesta que estabas buscando, pero lo útil es hacer algo así en el depurador:

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

Esto ayuda a identificar la vista. Asegúrate de ejecutar Ejecutar en el depurador para ver si tiene efecto.

Aquí hay un truco útil que puede hacer para ayudar en la debugging de AutoLayout. Puede agregar su propia propiedad de name a UIView través de una categoría y sobrecargar su método de description para include su nuevo name . Esto no le da un nombre visible en la información de debugging de AutoLayout, pero le permite ver fácilmente desde su dirección y ver su nombre.

Luego, simplemente asigne los nombres correspondientes en su controller de vista:

 - (void)viewDidLoad { [super viewDidLoad]; self.firstView.name = @"MyViewController.firstView"; self.secondView.name = @"MyViewController.secondView"; } 

Ahora cuando ves algo como esto:

 <NSAutoresizingMaskLayoutConstraint:0x175086220 h=-&- v=-&- UIView:0x147533250.height == UIView:0x14760b4a0.height> 

Puede simplemente ver las direcciones de la vista:

 po 0x147533250 MyViewController.firstView <UIView: 0x147533250> po 0x14760b4a0 MyViewController.secondView <UIView: 0x14760b4a0> 

Aquí está el código de categoría:

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 

Configuración en código, trabajó para mí:

codigo :

 imageView.accessibilityIdentifier = "profileImageView" 

salida :

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

En lugar de Identifier , use el campo ID de Storyboard . Es lo mismo.