2013-04-11 9 views
6

Naprawdę, naprawdę chcę dostarczyć "statyczne" komórki do mojego UICollectionView, dawniej z UITableView. Ale wiem, że dobrzy chłopcy i dziewczęta muszą używać dequeueReusableCellWithReuseIdentifier:forIndexPath: jako fabryki dla naszych komórek. Proponuję następujący schemat i proszę o opinie na temat jego potencjału. Jak na razie to działa dla mnie, ale lękam się nieznanego gnojka.Czy muszę wywoływać funkcję usuwania uniesienia UICollectionView: z poziomu komórkiFoldPath źródła danych :?

#import "MyCellClass.h" 

@implementation MyViewController { 
    MyCellClass *_cell0; // etc - many are possible. could store in array 
} 

-(void)viewDidLoad { 
    // assume MyCellClass has a +nib and +reuseId. The reader understands. 
    [_collectionView registerNib:[MyCellClass nib] forCellWithReuseIdentifier:[MyCellClass reuseId]]; 
} 

-(void)viewDidAppear:animated { 
    // this is where the fun begins. assume proper counts coming from the datasource 
    NSIndexPath *indexPath = [NSIndexPath indexPathWithRow:0 inSection:0]; 
    _cell0 = [[self collectionView] dequeueReusableCellWithReuseIdentifier:[MyCellClass reuseId] forIndexPath:indexPath]; 
    // etc 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath row] == 0) return _cell0; 
    // etc 
} 

Rozmyślnie błyszczę nad szczegółami, takimi jak konfigurowanie komórki. Szaleństwo? Geniusz? Tylko status quo? Wydaje się, że działa do tej pory, ale obawiam się, że Apple w jakiś sposób oczekuje, że dequeue zostanie wywołane z poziomu cellForPath. jakieś pomysły?

+2

Myślę, że prawdziwą odpowiedzią jest "nie musisz tego robić!" :) – Fattie

Odpowiedz

3

Response z Apple TSI Guy:

Chociaż powiedziałeś swoje prace aplikacji, to naprawdę powinien używać "dequeueReusableCellWithReuseIdentifier" od wewnątrz źródła danych metoda "cellForItemAtIndexPath". To jest obsługiwany wzorzec użycia. Nie próbuj trzymać się MyCellClass, pozwól, aby widok kolekcji zarządzał , który i poprosi Cię o usunięcie go, jeśli to konieczne.

Mam zamiar trochę wariować, zmienić mój kod, a następnie wysłać prośbę o ulepszenie. Ale mówię ci, że działało dobrze!

3

Jedynym powodem dzwonienia pod numer dequeueReusableCellWithReuseIdentifier:forIndexPath: jest ponowne użycie komórek. Ale "statyczny" widok kolekcji? Ile komórek mówimy? Gdybym miał widok kolekcji na tyle mały, że nigdy się nie przewijał, nie zastanawiałbym się, czy w ogóle nie użyć ponownie komórek. Że z pewnością rozwiązać problem starannie. W końcu statyczna tabela z storyboardu nie wykorzystuje ponownie komórek; to sprawia, że ​​jest statyczny. Powiedziałbym więc, że upuść wszystko na temat dequeueReusableCellWithReuseIdentifier:forIndexPath i po prostu podaj komórki, gdy o to zapytam.

Nie ma nic magicznego w przypadku dequeue; to tylko sposób na stwierdzenie, czy w stosie do ponownego wykorzystania są jakieś komórki, a także uzyskanie jednego, jeśli tak jest. W końcu zastanów się, jak działały wyświetlenia tabel, powiedzmy, iOS 4. Powiedziałeś: dequeue, ale jeśli nie było komórek do ponownego wykorzystania do zwrotu, tabela zwrócona nil i trzeba było alloc-init własnej komórki lub wyciągnąć ją ze stalówki, sobie. Cóż, proponujesz zrobić to dla wszystkie elementy w widoku kolekcji. Śmiało.

+0

Zgadzam się - mówimy o 6 komórkach, dużych, 4 do strony (poziome przewijanie). Dla tego. Przewiduję zmiany w przyszłości. W tej chwili jest trochę niechlujnie. Zgadzam się z tobą w zasadzie, ale szczegóły sytuacji wymagają czegoś takiego. – QED

+0

Jeśli chodzi o dostarczanie komórek, pomyślałem, że jestem * wymagany * do ich usunięcia. Czy mogę przydzielić/init/loadNib? W każdym razie wolałbym to zrobić. – QED

+0

Absolutnie. Jak już powiedziałem w mojej odpowiedzi, jedynym powodem do odkurzenia jest wyrzucenie ich ze stosu ponownego użycia. Jeśli nie używasz ponownie, nie musisz tego robić. A ponieważ usuwasz je wszystkie z góry, już ich nie używasz. – matt

0

Sprawdź mój , pozwala zdefiniować statyczne komórki UICollectionView z Konstruktora interfejsu bez potrzeby definiowania źródła danych.

Powiązane problemy