Nib ファイルからの UIView の読み込みに関しては多くの質問があるため、それは問題ではありません。UIView を Nib ファイルから正常にロードしていますが、問題は、ビューの設定方法によっては、ユーザーの操作がないか、IBActions がクラッシュを引き起こすことです。
シナリオ 0:
- (id) init {
self = [super init];
if (self) {
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
結果: これにより Nib からビューが読み込まれますが、UIButtons はタップできません。また、このビューがブロックすることになっているにもかかわらず、この背後にある View Controller のメイン ビューがまだインタラクティブであることにも気付きました。
シナリオ 1: この行を変更する
[self addSubview:self.view]
に
self = (MyView*)self.view;
ビューがその背後にあるメイン ビュー コントローラー ビューをブロックし、ボタンのサブビューがタップ可能になりますが、ボタンのセレクターを IBAction に接続すると、次のエラーでクラッシュが発生します。
-[MyView performSelector:withObject:withObject:]: message sent to deallocated instance 0x12f1cff0
このシナリオでビューの割り当てが解除されるのはなぜですか? 誰かが尋ねる前に、次のように単純にサブビューを追加しています。
MyView *myView = [[MyView alloc] init];
[self.view addSubview:myView];
編集:興味深いことに、(どちらのシナリオでも) awakeFromNib が呼び出されないことにも気付きました。それはすべきですか?