Jak rozumiem, chcesz:
- Zaprojektuj komórkę w IB, która może być używana w wielu scenach scenariuszy.
- Skonfiguruj unikalne sekwencje scenariuszy z tej komórki, w zależności od sceny, w której znajduje się komórka.
Niestety obecnie nie ma na to sposobu. Aby zrozumieć, dlaczego poprzednie próby nie zadziałały, musisz dowiedzieć się więcej o tym, jak działają scenorysy i prototypowe komórki widoku tabeli. (Jeśli nie obchodzi Cię, dlaczego te inne próby nie zadziałały, możesz odejść teraz. Nie mam dla ciebie żadnych magicznych obejść poza sugerowaniem zgłoszenia błędu).
Scenorys to w zasadzie niewiele więcej niż zbiór plików .xib. Po załadowaniu kontrolera widoku tabeli, który ma niektóre prototypowe komórki poza scenorysem, oto co się dzieje:
- Każda prototypowa komórka jest tak naprawdę własną osadzoną mini-stalówką. Tak więc, gdy kontroler widoku tabeli ładuje się, przechodzi przez każdą z końcówek i wywołań prototypowej komórki
-[UITableView registerNib:forCellReuseIdentifier:]
.
- Widok tabeli prosi kontroler o komórki.
- Prawdopodobnie dzwonisz
-[UITableView dequeueReusableCellWithIdentifier:]
Żądanie komórki z danym identyfikatorem ponownego użycia sprawdza, czy ma zarejestrowaną stalówkę. Jeśli tak, tworzy instancję tej komórki. Składa się z następujących kroków:
- Spójrz na klasę komórki, jak zdefiniowano w stalówce komórki. Zadzwoń
[[CellClass alloc] initWithCoder:]
.
-initWithCoder:
Metoda przechodzi i dodaje subviews i zestawów właściwości, które zostały określone w stalówki. ( IBOutlet
prawdopodobnie też się tu wciągam, chociaż tego nie testowałem; może się zdarzyć w -awakeFromNib
)
Skonfigurujesz komórkę, jak chcesz.
Należy tutaj zauważyć, że istnieje różnica między klasą komórki a jej wyglądem . Można utworzyć dwie oddzielne prototypowe komórki tej samej klasy, ale z ich podrzędnymi układami zupełnie inaczej. W rzeczywistości, jeśli użyjesz domyślnych UITableViewCell
stylów, właśnie tak się dzieje. Na przykład styl „Domyślny” i styl „Podtytuł” są reprezentowane przez tę samą UITableViewCell
klasę.
Jest to ważne : klasa komórki nie ma korelacji jeden-do-jednego z określoną hierarchią widoków . Hierarchia widoków jest całkowicie zdeterminowana tym, co znajduje się w komórce prototypowej zarejestrowanej w tym konkretnym kontrolerze.
Należy również zauważyć, że identyfikator ponownego wykorzystania komórki nie został zarejestrowany w niektórych globalnych aptekach komórkowych. Identyfikator ponownego wykorzystania jest używany tylko w kontekście pojedynczej UITableView
instancji.
Biorąc pod uwagę te informacje, spójrzmy na to, co wydarzyło się podczas powyższych prób.
W kontrolerze nr 1 dodano komórkę prototypową, ustawiłem klasę na moją podklasę UITableViewCell, ustawiłem identyfikator ponownego użycia, dodałem etykiety i podłączyłem je do gniazdek klasy. W kontrolerze nr 2 dodano pustą komórkę prototypową, ustaw ją na tę samą klasę i ponownie użyj identyfikatora jak poprzednio. Po uruchomieniu etykiety nigdy nie pojawiają się, gdy komórki są wyświetlane w kontrolerze nr 2. Działa dobrze w kontrolerze nr 1.
Jest to oczekiwane. Chociaż obie komórki miały tę samą klasę, hierarchia widoków przekazana do komórki w kontrolerze nr 2 była całkowicie pozbawiona widoków podrzędnych. Masz więc pustą komórkę, co dokładnie umieściłeś w prototypie.
Zaprojektowano każdy typ komórki w innym NIB i podłączono do odpowiedniej klasy komórek. W serii ujęć dodano pustą prototypową komórkę i ustawiono jej klasę i ponownie wykorzystuję identyfikator, aby odnosił się do mojej klasy komórek. W metodach viewDidLoad kontrolerów zarejestrowano te pliki NIB dla identyfikatora ponownego użycia. Pokazane komórki w obu kontrolerach były puste jak prototyp.
Ponownie jest to oczekiwane. Identyfikator ponownego użycia nie jest współdzielony między scenami scenicznymi lub stalówkami, więc fakt, że wszystkie te odrębne komórki miały ten sam identyfikator ponownego użycia, nie miał znaczenia. Komórka, którą odzyskasz z widoku tabeli, będzie miała wygląd pasujący do prototypowej komórki w tej scenie scenorysu.
To rozwiązanie było jednak bliskie. Jak zauważyłeś, możesz po prostu programowo wywołać -[UITableView registerNib:forCellReuseIdentifier:]
, przekazując UINib
komórkę zawierającą, a otrzymasz tę samą komórkę. (Nie dzieje się tak, ponieważ prototyp „przesłonił” stalówkę; po prostu nie zarejestrowałeś stalówki w widoku tabeli, więc nadal patrzył na stalówkę osadzoną w serii ujęć.) Niestety, w tym podejściu jest wada - nie ma sposobu, aby podłączyć sekwencje scenorysowe do komórki w samodzielnej stalówce.
Przechowywane prototypy w obu kontrolerach były puste i ustawiały klasę oraz ponownie używały identyfikatora do mojej klasy komórek. Zbudował interfejs użytkownika komórek całkowicie w kodzie. Komórki działają idealnie we wszystkich kontrolerach.
Naturalnie. Mamy nadzieję, że nie jest to zaskakujące.
Dlatego to nie zadziałało. Możesz zaprojektować swoje komórki w samodzielnych stalówkach i używać ich w wielu scenach scenariuszy; po prostu nie można obecnie podłączyć sekwencji z serii ujęć do tych komórek. Mam jednak nadzieję, że nauczyłeś się czegoś w trakcie czytania.