WWDC 2012(自動レイアウトをマスターするためのベストプラクティス)からの講演の中で、プレゼンターは、自動レイアウトのデバッグを支援するためにXcodeでUIView識別子を設定できると述べました。
これは本当に良い考えのように思えますが、私のiOSプロジェクトのXcode 4.5.1では、UIViewのIDを設定するために私が見ることができる方法はありません。
Xcode 4.5.1でUIViewのIDを設定するにはどうすればよいですか? iOSプロジェクトでこれが不可能な場合、どうすれば同じ機能を利用できますか?
accessibilityIdentifier
をUIView
に設定するとうまくいきます。 Xcode 6.4、iOS8.4でテスト済み。
Identifierは、Mac OSXのNSViewでのみ使用できるようです。 iOSのUIViewでは使用できません。
悪い制約を見つけます。
特定のビューに影響を与える制約を取得するには、constraintsAffectingLayoutForOrientation:を使用します。その後、デバッガーで制約を検査できます。それらは、視覚的なフォーマット表記を使用して印刷されます。ビューに識別子(識別子(NSView)を参照)がある場合、次のように説明の識別子を使用して出力されます。
ここで説明されているように: http://developer.Apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html
残念ながら、これを行う方法はないようです。私はほとんどすべてを埋めようとしましたが、何も機能しませんでした。 restoreIdもアクセシビリティ特性もこれに影響を与えません。スクリーンショットを見ると、実際に彼がNSViewを設定していることがわかります。NSViewにはidentifierプロパティがあります。
コードの設定、私のために働いた:
コード:
imageView.accessibilityIdentifier = "profileImageView"
出力:
<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40 (active, names: profileImageView:0x10fd48110 )>
あなたが探していた答えは完全ではありませんが、役立つのはデバッガーでこのようなことをすることです:
expr [(UIButton*)0x12345 setBackgroundColor:[UIColor purpleColor]]
これは、ビューの識別に役立ちます。ただし、デバッガーで実行を押して、有効になることを確認してください。
AutoLayoutのデバッグを支援するために実行できる便利なトリックを次に示します。独自のname
プロパティをカテゴリを介してUIView
に追加し、そのdescription
メソッドをオーバーロードして新しいname
を含めることができます。これにより、AutoLayoutデバッグ情報に表示される名前が完全に表示されるわけではありませんが、アドレスからビューを簡単にpo
して、指定された名前を確認できます。
次に、ViewControllerで適切な名前を割り当てます。
- (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>
カテゴリコードは次のとおりです。
IView + Name.h
#import <UIKit/UIKit.h>
@interface UIView (Name)
@property (strong, nonatomic) NSString *name;
- (NSString *)description;
@end
IView + 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