Подтвердить что ты не робот

Как установить Идентификатор UIView в Xcode/iOS для отладки автоматической разметки?

Во время разговора с WWDC 2012 ( "Лучшие практики для мастеринга автоматической компоновки" ) ведущий сказал, что вы можете установить идентификатор UIView в Xcode, чтобы помочь в отладке автоматического макета:

Identifier for UIView

Это кажется действительно хорошей идеей, но в Xcode 4.5.1 для моего iOS-проекта нет возможности увидеть, как установить идентификатор UIView.

Как установить идентификатор UIView в Xcode 4.5.1? Если это невозможно в проектах iOS, как я могу получить те же функции?

4b9b3361

Ответ 1

Настройка accessibilityIdentifier на UIView делает трюк. Протестировано на Xcode 6.4, iOS 8.4.

Ответ 2

Похоже, идентификатор доступен только в NSView только в Mac OSX. Это не доступно на UIView в iOS.

Найдите плохое ограничение или ограничения.

Чтобы получить ограничения, влияющие на конкретное представление, используйте constraintsAffectingLayoutForOrientation :. Затем вы можете проверить ограничения в отладчике. Они печатаются с использованием визуального обозначения формата. Если ваши представления имеют идентификаторы (см. идентификатор (NSView)), они распечатываются с использованием идентификатора в описании, например:

Как описано здесь:http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html

Ответ 3

К сожалению, похоже, что это не так. Я пробовал заполнять почти все, и ничего не получилось. Ни восстановление, ни признаки доступности не влияют на это. Если вы посмотрите на скриншот, вы увидите, что на самом деле он устанавливает 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

Вместо Identifier используйте поле идентификатора Storyboard. То же самое.