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ć:
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 -
Nadal nie mogę tego zmusić do współpracy z moim własnym projektem. Czy projekt, który wysłali, może zostać uproszczony?