5

私は私の最後の質問をフォローアップするために新しい質問を開いています(サブビューを追加した後のsuperviewとparentviewcontrollernil)。基本的に、サブビューを使用することは良い考えですが、別のViewController内にあるサブビューを制御するViewControllerを使用するべきではありません。基本的に私は次のことをしたいと思います...私は共通のサブビューを共有する2つのViewControllerを持っています。そのサブビューをSearchDate.xibというペン先として作成しました。ファイルの所有者は、対応するクラスSearchDateView.m/hです。そのクラスには、ラベルであるnibのUIView内の唯一の要素のアウトレットがあります。SearchDateViewクラスには、SearchDateView.xibのラベルの値を変更するための関数もあります。両方のViewControllerにこのペン先をロードしたいのですが、どうやらペン先を適切にロードする方法がわかりません。私が何をしても、せいぜい何も表示されず、最悪の場合、例外がスローされます。アップルのドキュメントでは、IB内のクラスの他のインスタンスをメインビューにドラッグすることについて説明していますが、それはうまくいかないようです。ViewControllerにSearchDateViewアウトレットがあり、コントローラーのロードビューでこれを実行してみました。

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0];
[[self view] addSubview:searchDateView];

しかし、私はこの例外を受け取ります:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.'

私は完全に間違ったことをしていることを知っていますが、ペン先、そのペン先のオブジェクトの一部を更新する関連付けられたビュークラスを持ち、そのペン先を別のコントローラーで再利用する正しい方法は何ですか?

編集:コメントを考えると、おそらくこれは十分に明確ではありませんでした。ビュー全体に同じnibファイルを使用したくはありません。サブビューではありません。たとえば、コントローラーAにはマップとSearchDateViewがあり、コントローラーBにはテーブルビューとSearchDateViewがあります。だから私はサブビューを複数のコントローラーにロードする方法を考えています...

4

2 に答える 2

2

initWithNibName:bundle:を使用して各コントローラーを初期化する場合、複数のコントローラーに同じNIBファイルを使用しても問題はありません。ただし、通常、コントローラー内からコントローラー自体のnibファイルをロードすることはありません。

loadNibNamed :::を使用してnibファイルをロードすると、オブジェクトが定義されたNSArrayが取得されるため、ビューとして直接使用することはできません。ビューを取得する1つの方法は、for()などを使用して配列を検索し、必要なオブジェクトを見つけることですが、owner:selfを設定すると、File's Ownerがselfになるため、File'sOwnerに接続されているアウトレットに接続する必要があります。 。ただし、この場合は戻り値を破棄できます。返された配列は必要ありません。そのコンセントを接続している場合、それが主な問題(アレイでコンセントを塞ぐ)になる可能性があります。

loadNibNamedを使用して特定のビューオブジェクトをロードし(返された配列から選択したと仮定して)、それを何らかの方法で表示することは可能ですが、通常はコントローラーでinitWithNibNameを使用する方が簡単です(この場合、ファイルの所有者がコントローラーになります) 。

ああ、そしてInterfaceBuilderでコントローラーのnibファイルを設定することもできます。基本的には、initWithNibNamedのようなことを行うようにnibファイルを設定するようにInterface Builderに指示するだけなので、複数のコントローラーに同じnibを使用しても問題はありません。コントローラオブジェクトをクリックして、インスペクタウィンドウを確認します。

アップデート

複数のコントローラーで1つのビューのみを使用するために、おそらくこれを行います。

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FooView" 
                                                 owner:self options:nil];
    for (id obj in nib)
        if ([obj isKindOfClass:[FooView class]])
            myNewView = (FooView *)obj;

(第8章から盗まれた:iPhone 3開発の開始からのサンプルコードのセル2。 )

IBのアウトレットでこれを行うことができます。その場合、forループを省略できますが、アウトレットを宣言する両方のコントローラーのスーパークラスと、File'sOwnerがそのスーパークラスのインスタンスであることをInterfaceBuilderに通知するものが必要になる可能性があります。だからそれはアウトレットについて知っています。おそらくトラブルの価値はありません。

于 2010-01-14T18:43:58.897 に答える
0

ViewControllerにSearchDateViewアウトレットがあり、コントローラーのロードビューでこれを実行してみました。

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0];
[[self view] addSubview:searchDateView];

しかし、私はこの例外を受け取ります:

 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.'

Cocoa Bindings(Cocoa TouchではなくCocoaでのみ使用可能)がない場合、これら2つは関連していないと思います。

Xcodeで、にシンボリックブレークポイントを追加してobjc_exception_throwから、デバッガーでアプリを実行します。壊れたら、コールスタックを調べます。問題が実際に発生した場所を見つけることができます。

于 2010-01-16T08:19:44.980 に答える