次のようなView Controllerルート要素を持つペン先があります:
そのため、自動レイアウトを使用して、上部と下部のレイアウト ガイドを基準にして要素を配置できます。
私が最初にこのペン先をロードしようとしたとき
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
次の実行時例外が発生しました。
キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。
xibのファイル所有者をビューコントローラーのクラスに設定する必要があり、ビューアウトレットをxibのビューオブジェクトに設定する必要があるというエラーをグーグルで検索しました。そうすると、次の実行時エラーが発生します。
キャッチされない例外 'UIViewControllerHierarchyInconsistency' が原因でアプリを終了しています。ビュー > は に関連付けられています。このビューを に関連付ける前に、この関連付けをクリアしてください。'
ビューはファイル所有者と nib の最上位のビュー コントローラーの両方に関連付けられているため、驚くことではありません。しかし、これらが 2 つの別個のエンティティではなく、実際にはまったく同じものであることをランタイムに伝えるにはどうすればよいでしょうか?
編集: ViewController を nib から unpck しようとすると、
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
、どちらも役に立ちません:
キャッチされない例外 'NSUnknownKeyException' が原因でアプリを終了しています。理由: '[ setValue:forUndefinedKey:]: このクラスは、キー ビューのキー値コーディングに準拠していません。
一時的な解決策:
解決策を見つけましたが、きれいではありません。IB に示されている構造にもかかわらず、View Controller は xib の最後のオブジェクトではありません。ので、私は持っています:
__block SearchViewControllerPro* mapSearchViewController = nil;
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[SearchViewControllerPro class]]) {
mapSearchViewController = obj;
}
}];
これは実行時のクラッシュなしで機能するようです。ただし、それはクリーンなコード以外のすべてです。