3

NSCollection ビューを互いに入れ子にしようとしています。Apple クイック スタート ガイドをベースとして新しいプロジェクトを作成しようとしました。

コレクション ビューを nib に挿入することから始めます。自動的に追加されたビューに、別のコレクション ビューをドラッグします。追加されたサブコレクション ビューには、いくつかのラベルが付けられます。これが私のニブの写真です:

完成したニブ

次に戻ってモデルを構築します。私の第 2 レベルのモデル .h は

@interface BPG_PersonModel : NSObject

@property(retain, readwrite) NSString * name;
@property(retain, readwrite) NSString * occupation;

@end

私の最初のレベルのモデル .h は次のとおりです。

@interface BPG_MultiPersonModel : NSObject

@property(retain, readwrite) NSString * groupName;
@property(retain,readwrite) NSMutableArray *personModelArray;

-(NSMutableArray*)setupMultiPersonArray;

@end

次に、第 1 レベルのコントローラー (第 2 レベルのモデルを構築) 内でいくつかの偽の人物を作成するための実装を書き出します: (編集) awakefromnibcode を削除します。

/*- (void)awakeFromNib {

    BPG_PersonModel * pm1 = [[BPG_PersonModel alloc] init];
    pm1.name = @"John Appleseed";
    pm1.occupation = @"Doctor";

    //similar code here for pm2,pm3

    NSMutableArray * tempArray = [NSMutableArray arrayWithObjects:pm1, pm2, pm3, nil];
    [self setPersonModelArray:tempArray];

} */


-(NSMutableArray*)setupMultiPersonArray{
    BPG_PersonModel * pm1 = [[BPG_PersonModel alloc] init];
    pm1.name = @"John Appleseed";
    pm1.occupation = @"Doctor";

    //similar code here for pm2,pm3


    NSMutableArray * tempArray = [NSMutableArray arrayWithObjects:pm1, pm2, pm3, nil];
    return tempArray;
}

最後に、appdelegate で同様の実装を行い、複数人配列を構築します

- (void)awakeFromNib {

    self.multiPersonArray = [[NSMutableArray alloc] initWithCapacity:1];

    BPG_MultiPersonModel * mpm1 = [[BPG_MultiPersonModel alloc] init];
    mpm1.groupName = @"1st list";
    mpm1.personModelArray = [mpm1 setupMultiPersonArray];

(ここにすべてのコードを含めているわけではありません。役に立つかどうか教えてください。)

次に、クイック スタート ガイドで推奨されているように、すべてをバインドします。配列コントローラーの各レベルをコントローラー オブジェクトにバインドする属性を追加した 2 つの nsarraycontrollers を追加します。

次に、arrangedobjects にバインドされたコンテンツを使用して、collectionview を配列コントローラーにバインドします。

最後に、サブビューをバインドします。

私のモデルのpresentedobject.grouptitleオブジェクトへのgrouptitleラベル付き

次に、私の名前と職業のラベルをそれぞれの表現オブジェクトに

必要なアクセサ メソッドを含めることで、すべてのオブジェクトを kvo 準拠にしました。

次に、このアプリを実行しようとすると、最初に表示されるエラーは次のとおりです。NSCollectionView item prototype must not be nil.

(編集) 最初のレベルのモデルから awakefromnib を削除した後、これが得られます

ここに画像の説明を入力

nscollection ビューのネストに成功した人はいますか? ここで何が間違っていますか?他の人がテストできるように圧縮された完全なプロジェクトを次に示します。

http://db.tt/WPMFuKsk

助けてくれてありがとう

編集:

最後に、アップルのテクニカルサポートに連絡して、彼らが私を助けてくれるかどうかを確認しました. 彼らからの応答は次のとおりです。

Cocoa バインディングは、すべてを機能させるために追加のコードが必要になるまで、これまでのところしか機能しません。

配列内で配列を使用してコレクション ビューにデータを設定する場合、NSCollectionView によって提供されるビュー レプリケーションの実装を使用する代わりに、NSCollectionView をサブクラス化し、newItemForRepresentedObject をオーバーライドし、同じ xib を自分でインスタンス化しない限り、バインディングはレプリケートされた各ビューに正しく転送されません。

そのため、newItemForRepresentedObject アプローチを使用する場合は、NSCollectionViewItems を個別の xib に分解して、グループ コレクション ビューから内部コレクション ビューに人々のサブ配列を渡すことができるようにする必要があります。

したがって、グループ化されたコレクション ビューでは、オーバーライドは次のようになります。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object 
{ 
BPG_MultiPersonModel *model = object; 
MyItemViewController *item = [[MyItemViewController alloc] initWithNibName:@"GroupPrototype" bundle:nil]; 
item.representedObject = object; 
item.personModelArray = [[NSArrayController alloc] initWithContent:model.personModelArray]; 
return item; 
} 

内部コレクションのサブクラスの場合、オーバーライドは次のようになります。

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object 
{ 
PersonViewController *item = [[PersonViewController alloc] initWithNibName:@"PersonPrototype" bundle:nil]; 
item.representedObject = object; 
return item; 
}

これは彼らが私に送り返したサンプルプロジェクトです -

http://db.tt/WPMFuKsk

私はまだこれを自分のプロジェクトで動作させることができません。彼らが送り返したプロジェクトをさらに簡素化することはできますか?

4

1 に答える 1

1

この回答をよく見てください

簡単な回答: 各 NSView を独自の .xib に抽出すると、この問題が解決するはずです。

拡張: NSCollectionViewItem サブクラスで指定された IBOutlet は、プロトタイプがコピーされるときに接続されません。では、NSCollectionViewItem サブクラスで指定された IBOutlet をビュー内のコントロールに接続するにはどうすればよいでしょうか。

Interface Builder は、カスタム NSView を NSCollectionView および NSCollectionViewItem と同じ nib に配置します。これはばかげています。解決策は、NSView を独自の nib に移動し、コントローラーにプログラムでビューをロードさせることです。

  • NSView を独自の nib に移動します (これにより、NSCollectionViewItem と NSView の間の接続が切断されます)。
  • IB で、File Owner の Class Identity を NSCollectionViewItem サブクラスに変更します。
  • コントロールを File Owner アウトレットに接続します。
  • 最後に、NSCollectionViewItem サブクラスを取得して nib をロードします。

便利なリンク:

  1. プログラムでゼロから nscollectionview を作成する方法
  2. nscollectionview のヒント
  3. nscollectionview をネストしようとすると失敗する
  4. nscollectionview redux
于 2014-02-27T01:42:23.100 に答える