7

次のような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;
    }
}];

これは実行時のクラッシュなしで機能するようです。ただし、それはクリーンなコード以外のすべてです。

4

3 に答える 3

4

2 つの別個のエンティティではなく、実際には両方ともまったく同じものであることをランタイムに伝えるにはどうすればよいでしょうか?

それらは同じものではないため、できません。2 つのインスタンスを作成しSearchViewControllerProました。

SearchViewControllerPro インスタンスを割り当てて初期化するか、nib からアーカイブを解除する必要があります。

nib で ViewController を作成することにした場合、それにアクセスする通常の方法は、nib で作成する他の項目 (ビュー、ボタン、テキストフィールド) にアクセスする方法と同じです。

FilesOwner オブジェクトにアウトレットを追加し、インターフェイス ビルダーで接続をフックし、nib を展開するときに必ずオブジェクトを渡します。

たとえば、nib を展開するオブジェクトを FilesOwner にしたい場合:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil];
于 2013-09-25T11:00:28.327 に答える
3

以下も同様に機能し、(少なくとも私にとっては) ViewController のアウトレットを作成することをもう少し明確にしています。

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0];
于 2013-09-25T12:40:07.703 に答える