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 ビューのネストに成功した人はいますか? ここで何が間違っていますか?他の人がテストできるように圧縮された完全なプロジェクトを次に示します。
助けてくれてありがとう
編集:
最後に、アップルのテクニカルサポートに連絡して、彼らが私を助けてくれるかどうかを確認しました. 彼らからの応答は次のとおりです。
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; }
これは彼らが私に送り返したサンプルプロジェクトです -
私はまだこれを自分のプロジェクトで動作させることができません。彼らが送り返したプロジェクトをさらに簡素化することはできますか?