Zagnieżdżone NSCollectionView Z wiązaniami

Próbuję zagnieździć widok NSCollection wewnątrz siebie. Próbowałem utworzyć nowy projekt za pomocąPrzewodnik szybkiego uruchamiania Apple jako baza.

Zaczynam od wstawienia widoku kolekcji do mojej stalówki, do widoku, który jest automatycznie dodawany, przeciągam na niego inny widok kolekcji. Dodany widok pod-kolekcji pobiera niektóre etykiety. Oto zdjęcie mojej stalówki:

Potem wracam i buduję moje modele: mój drugi poziom modelu .h jest

@interface BPG_PersonModel : NSObject

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

@end

Mój model pierwszego poziomu .h to:

@interface BPG_MultiPersonModel : NSObject

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

-(NSMutableArray*)setupMultiPersonArray;

@end

Następnie piszę implementację, aby zrobić fałszywych ludzi w kontrolerze pierwszego poziomu (budowanie modelu drugiego poziomu): (edytuj) usuń 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;
}

W końcu wykonuję podobną implementację w moim appdelegate, aby zbudować tablicę wieloosobową

- (void)awakeFromNib {

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

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

(Nie włączam tutaj całego kodu, daj mi znać, jeśli będzie to przydatne.)

Następnie wiążę wszystko zgodnie z zaleceniami przewodnika szybkiego startu. Dodaję dwa kontrolery nsarraycontrolera z atrybutami dodanymi, aby powiązać każdy poziom kontrolera macierzy z obiektem kontrolera

Następnie wiążę collectionview z kontrolerem tablicowym, używając treści powiązanych z ustawionymi obiektami

W końcu wiążę subviews:

z etykietą grouptitle do obiektu representobject.grouptitle w moim modelu

potem moje imię i etykiety zawodów do ich reprezentowanych obiektów

Zrobiłem wszystkie obiekty zgodne z kvo, włączając niezbędne metody dostępu

Następnie próbuję uruchomić tę aplikację, a pierwszy otrzymany błąd to:NSCollectionView item prototype must not be nil.

(edytuj) po usunięciu awakefromnib z modelu pierwszego poziomu otrzymuję to

Czy ktoś odniósł sukces w zagnieżdżaniu widoków nscollection? Co ja tu robię źle? Oto kompletny projekt, który inni mogą przetestować:

http://db.tt/WPMFuKsk

dzięki za pomoc

EDYTOWANE:

W końcu skontaktowałem się ze wsparciem technicznym firmy Apple, aby sprawdzić, czy mogą mi pomóc. Odpowiedź od nich:

Wiązania Cocoa pójdą tak daleko, dopóki nie będziesz potrzebować dodatkowego kodu, aby wszystko działało.

Podczas używania tablic w tablicach do wypełnienia widoku kolekcji powiązania nie będą poprawnie przesyłane do każdego replikowanego widoku bez podklasy NSCollectionView i nadpisywania newItemForRepresentedObject i tworzenia instancji tego samego xib, zamiast używania implementacji replikacji widoku dostarczonej przez NSCollectionView.

Korzystając z podejścia newItemForRepresentedObject, należy uwzględnić nasze NSCollectionViewItems w oddzielnych xibach, aby można było przekazać podzakres osób z widoku kolekcji grup do wewnętrznego widoku kolekcji.

Więc dla twojego zgrupowanego widoku kolekcji Twoje zastąpienie wygląda tak:

- (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; 
} 

A dla twojej wewnętrznej podklasy kolekcji Twoje zastąpienie wygląda tak:

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

Oto przykładowy projekt, który mi przesłali -

http://db.tt/WPMFuKsk

Nadal nie mogę tego zmusić do współpracy z moim własnym projektem. Czy projekt, który wysłali, może zostać uproszczony?

questionAnswers(1)

yourAnswerToTheQuestion