3

NSCollectionViewItemXcode 3.1.2では、サブクラスのnib を次のNSCollectionViewItemようにロードしていました。

-(id)copyWithZone:(NSZone *)zone
{   
    id result = [super copyWithZone:zone];

    [NSBundle loadNibNamed:@"PersonView" owner:result];

    return result;
}

10.6 未満の Xcode 3.2 では、同じメソッドでエラーが発生することはありませんが、NSCollectionViewどちらのビューも読み込まれません。

ビューを表示するために他に何かする必要がありますか? NSCollectionItemまたは、スーパークラスをに変更することで、これを行うより良い方法はありNSViewControllerますか?

結局のところ、copyWithZoneこの標準機能を実現するためにオーバーライドすることは、私には常にハックのように思えました。IB で使用されるペン先を指定できるようにすべきだと思いますが、Apple はそうは考えていないようです。

ドキュメントで利用可能な例を見ましたが、を使用してNSCollectionViewItemプログラムでインスタンス化さinitWithNibNameれていますが、IBで作成したいと思います。

更新

kperryua が提案したことを実行しましたが、今では からアウトレットにアクセスできませんNSCollectionViewItem。これが私がやろうとしていることです:

- (void)setRepresentedObject:(id)object {

    if (object) {
        [labelName setValue:[object name]];
    }
}

ラベル名をファイル所有者にバインドしました。これは私のNSCollectionViewItem. これは 10.5 で完全に機能していましたが、現在はアウトレットが割り当てられていません (GDB で確認しました)。

バインディングを示す画像 http://img21.imageshack.us/img21/671/picya.png

更新 2 :

また、を(PersonController)NSCollectionViewitemPrototypeサブクラスにバインドしました。NSCollectionViewItem

バインディングを示す画像 http://img503.imageshack.us/img503/4672/pic2d.png

File's Ownerこれで、 のPersonView.nibと のitemPrototypeの両方がNSCollectionViewサブクラスを指しています。

コンソール出力を示す画像 http://img340.imageshack.us/img340/6184/pic3.png

スクリーンショットでわかるように、アイテムは表示されますが、コンセントlabelNameにアクセスできないため、ラベルのテキストを変更できません。

「名前」ではないことを確認するために、設定しようとしている名前も記録しました。

ラベルの値を変更するには、何をする必要がありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

4

はい、Snow Leopard ではこれがずっと簡単になります。IB で NSCollectionViewItem をクリックし、nib 名とバンドル名を設定します (メイン バンドルの場合は空白のままにします)。PersonView nib で、NSCollectionViewItem を File's Owner にし、-view アウトレットをその nib のビューに接続します。(すでにそのペン先でこのように設定されているようです。) 他のすべては自動である必要があり、copyWithZone: をオーバーライドする必要はありません。

于 2009-09-27T20:35:50.453 に答える
0

のプロパティをIB要素の値と同期するにrepresentedObjectは、Cocoaバインディングを使用することをお勧めします。この場合、TextFieldの値をファイルの所有者モデルキーパス にバインドします。representedObject.name

私はそれを10.6Xcode3.2で動作させましたしかし、うまくいかないのは、あなたがしたことです。IB要素を私のCollectionViewItemのアウトレットに接続します。私はCollectionViewItemのカスタムサブクラスを持っており、すべてがあなたのように設定されています。しかし、アプリケーションを実行すると、次のように失敗します

[NSTextField copyWithZone:]:認識されないセレクターがインスタンス0x210a60に送信されました2009-10-19 13:05:18.772 WrapperTest [24122:a0f]キャッチされない例外が発生しました2009-10-19 13:05:18.774 WrapperTest [24122:a0f]- [NSTextField copyWithZone:]:認識されないセレクターがインスタンス0x210a60に送信されました2009-10-19 13:05:18.779 WrapperTest [24122:a0f]***キャッチされない例外'NSInvalidArgumentException'、理由:'-[NSTextField copyWithZone:]によりアプリが終了します:認識されないセレクターがインスタンス0x210a60に送信されました'***最初のスローでスタックを呼び出します:(0 CoreFoundation 0x977f658a __raiseError + 410 1 libobjc.A.dylib 0x9767ff49 objc_exception_throw + 56 2 CoreFoundation 0x978429db-[NSObject(NSObject)doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x9779e026 ___ forwarding ___ + 950 4 CoreFoundation 0x9779dbf2 _CF_forwarding_prep_0 + 50 5 CoreFoundation 0x97789a5a-[NSObject(NSObject)copy] + 42 6 AppKit 0x918ce1d7-[NSViewController setTitle:] + 70 7 App ..] + 70 7 AppKit 0x91167dab-[NSNibOutletConnectorestablishConnection] +406..。] + 70 7 AppKit 0x91167dab-[NSNibOutletConnectorestablishConnection] +406..。

彼らはそれを実装する必要があるので、なぜそれらNSTextFieldsが欠けているのかわかりませんcopyWithZone

気づかなかったのですが、これらのアウトレットをビューのプロパティとして宣言する必要があることを修正しました。バインディングを含むすべてが機能しているようです。

于 2009-10-19T11:25:05.817 に答える