3

私は iOS 開発の初心者で、ファイル所有者のロジックを理解するのに問題があります。

私はこの状況を持っています:

2 つのビュー (View_iPad、View_iPhone) とそれらのコントローラー (ViewController_iPad、ViewController_iPhone) があります。アプリが起動されるデバイスに基づいて、特定のビューとそのコントローラーが使用されます。次に、xib ファイルからこのビューにサブビューを追加します (iPad ビューと iPhone ビューのどちらを使用するかは関係ありません)。iPad ビューと iPhone ビューで、このサブビューの位置が異なるとします。このサブビューにはいくつかのラベルが含まれているため、サブビュー コントローラーで IBOulets を作成する必要があります。

アップルのロジックによれば、ビューのファイル所有者はコントローラー(このビューにアクセスして通信できるファイル)です。したがって、3 つのビュー (iPhone、iPad、サブビュー) のそれぞれに独自のコントローラーがあり、これらのコントローラーがこれらのビューのファイル所有者であることを意味します。

しかし、サブビューをコードでロードすると:

     NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil];

サブビューとして iPad/iPhone ビューに追加すると、このサブビューにはラベル用の IBOutlets が含まれており、このラベルは iPhone/iPad コントローラーではなくサブビュー コントローラーにあるため、問題が発生します。

このエラーは次のように表示されます。

キャッチされていない例外 'NSUnknownKeyException' が原因でアプリを終了しています。

どうすればこれを解決できますか? @"subviewController" を所有者として入れようとしましたが、役に立ちませんでした。ありがとうございました。

編集!!: だから私はこれを解決しようとしていましたが、それでもうまくいきません。ここに新しい状況があります:

サブビュー コントローラーはサブビューの所有者ですが、ルート ビューのカスタム クラスは、アウトレットを含む (UIView から派生した) クラスです。

iPad/iPhone コントローラー所有者:@"subviewController" にある場合、次のエラーが発生しました。

キャッチされていない例外 'NSUnknownKeyException' が原因でアプリを終了しています。

ビューはサブビューコントローラーのプロパティです。どこに問題があるのか​​教えてください。私は本当に絶望的です!

または、owner:self がある場合、EXC_BAD_ACCESS エラーで指示のあるウィンドウが開かれます。

4

2 に答える 2

3

まず第一に、xib/storyboard から作成されたビュー コントローラーがある場合、ビュー コントローラーownsは彼のビューです。xib ファイルを使用してカスタム ビューを作成する場合、ファイルの所有者はカスタム クラス (UIView のサブクラス) になりますが、xib ファイルを使用してカスタム ビューを作成する場合は、IBOutlest をファイル所有者ではなく UIView にリンクする必要があります。ビューコントローラーを持っているときにやっています。

第二に、問題ownerは間違ってリンクされたアウトレットによって生成された問題によって生成されたものではありません。おそらくビューを文字列であるアウトレットにリンクしたため、すべてのアウトレットとそれに対応するビューを確認してください。

于 2013-05-16T12:25:10.760 に答える
2

Xcode の Interface Builder に似た部分にあるファイルの所有者アイコン (IB が個別に存在しないため) は、nib がロードされたときに所有者として指定されたオブジェクトのプロキシです。通常、これは nib をロードするオブジェクトであり、通常はアプリケーションまたはビュー コントローラーです。

あなたが言う時:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil];

ファイルの所有者は、上の行にあるオブジェクトになりますself。上記の行を含むオブジェクト以外のオブジェクトを所有者にしたい場合は、そのオブジェクトをowner:パラメーターに指定します。

于 2013-05-16T12:22:09.827 に答える