Próbuję dowiedzieć się, jak ustawić, UITableViewCellStyle
gdy używam nowych metod w iOS 6 dla UITableView
.
Wcześniej podczas tworzenia wyliczenia UITableViewCell
zmieniałem UITableViewCellStyle
wyliczenie, aby podczas wywoływania utworzyć różne typy komórek domyślnych, initWithStyle:
ale z tego, co mogę zebrać, już tak nie jest.
Dokumentacja Apple dla UITableView
stanów:
Wartość zwracana: obiekt UITableViewCell ze skojarzonym identyfikatorem ponownego wykorzystania. Ta metoda zawsze zwraca prawidłową komórkę.
Dyskusja : ze względu na wydajność źródło danych widoku tabeli powinno zasadniczo ponownie wykorzystywać obiekty UITableViewCell, gdy przypisuje komórki do wierszy w swojej metodzie tableView: cellForRowAtIndexPath:. Widok tabeli przechowuje kolejkę lub listę obiektów UITableViewCell, które źródło danych oznaczyło do ponownego użycia. Wywołaj tę metodę z obiektu źródła danych, gdy zostaniesz poproszony o podanie nowej komórki dla widoku tabeli. Ta metoda usuwa z kolejki istniejącą komórkę, jeśli jest dostępna, lub tworzy nową na podstawie poprzednio zarejestrowanej klasy lub pliku nib.
Ważne : Przed wywołaniem tej metody należy zarejestrować klasę lub plik nib przy użyciu metody registerNib: forCellReuseIdentifier: lub registerClass: forCellReuseIdentifier:.
Jeśli zarejestrowano klasę dla określonego identyfikatora i trzeba utworzyć nową komórkę, ta metoda inicjuje komórkę, wywołując jej metodę initWithStyle: reuseIdentifier:. W przypadku komórek opartych na końcówkach ta metoda ładuje obiekt komórki z dostarczonego pliku nib. Jeśli istniejąca komórka była dostępna do ponownego użycia, ta metoda wywołuje zamiast niej metodę prepaid komórki.
Oto jak cellForRowAtIndexPath
wygląda mój nowy po wdrożeniu nowych metod:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"cell_identifier";
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
return cell;
}
Kod, który mam do tej pory, działa dobrze, ale zawsze zwraca domyślny styl. Jak mogę to zmienić, więc mogę utworzyć komórki z innych stylów, takich jak UITableViewCellStyleDefault
, UITableViewCellStyleValue1
, UITableViewCellStyleValue2
i UITableViewCellStyleSubtitle
?
Nie chcę podklasy UITableViewCell
, chcę po prostu zmienić domyślny typ, tak jak mogłem to zrobić przed iOS 6. Wydaje się dziwne, że Apple zapewnia ulepszone metody, ale z minimalną dokumentacją wspierającą ich implementację.
Czy ktoś to opanował lub napotkał podobny problem? W ogóle staram się znaleźć jakiekolwiek rozsądne informacje.
źródło
UITableViewCell
celu uzyskania innych domyślnych stylów jest uciążliwa, ponieważ tworzy po prostu niepotrzebne pliki. Dziękuję za komentarz i potwierdzenie moich podejrzeń.dequeueReusableCellWithIdentifier
nie jest przestarzały, więc nie musisz używać nowegodequeueReusableCellWithIdentifier:forIndexPath:
.Użyj nowego sposobu wraz z odpowiednią metodą rejestru (w viewDidLoad), jeśli używasz niestandardowej klasy komórek, ale użyj starego sposobu, jeśli chcesz użyć jednego z wyliczeń UITableViewCellStyle.
źródło
dequeueReusableCellWithIdentifier:forIndexPath:
niektóre identyfikatory budujące komórki w stary sposób (i zwracające je). Inne identyfikatory będą wywoływać super i zwracać to. Miałoby sens posiadanieNSDictionary
identyfikatorów of do konstruowania bloków dla tego rodzaju identyfikatorów.Możesz uniknąć zbędnych podklas, używając konstruktora interfejsu scenorysu:
Nowy system iOS 6.0
dequeueReusableCellWithIdentifier:forIndexPath:
używa tych wartości podczas przydzielania nowych komórek i zwracania ich. (Testowane na kompilacji systemu iOS 6.0 przy użyciu Xcode 4.5.2)źródło
Inną alternatywą, która zapisuje jeden plik, jest utworzenie końcówki i użycie
registerNib:forCellReuseIdentifier:
zamiast niej.Tworzenie końcówki jest łatwe: utwórz nowy plik .xib w programie Interface Builder. Usuń widok domyślny. Dodaj obiekt komórki widoku tabeli. Korzystając z Inspektora atrybutów, zmień styl komórki. (Tutaj masz również możliwość dalszego dostosowania komórki, dostosowując inne atrybuty).
Następnie w
viewDidLoad
metodzie kontrolera widoku tabeli wywołaj coś takiego:źródło
Odpowiedź Bolot jest poprawna. Proste i nie musisz tworzyć żadnego pliku XIB.
Chciałem tylko zaktualizować jego odpowiedź dla każdego, kto robi to za pomocą Swift zamiast Objective-C:
źródło
Moim rozwiązaniem jest zadzwonienie
initWithStyle: reuseIdentifier:
po uzyskaniu go za pomocą[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]
. W końcuinit
to tylko kolejny selektor, a kompilator nie nakłada żadnych ograniczeń na wywoływanie go na już zainicjowanym obiekcie. Będzie jednak narzekać, że nie używa wyniku wywołania init, więc robię:Wyobrażam sobie, że to nie zadziała w Swift ...
źródło
initWithStyle: reuseIdentifier
po raz drugi, faktycznie nadpisujesz komórkę nowo utworzonym obiektem. Tak, alokacja pamięci została już wykonana, a nowa komórka nadpisze tę samą lokalizację pamięci, ale w rzeczywistości tworzysz całkowicie nowy obiekt, gdy ponownie go zainicjujesz. To neguje całą optymalizację, która jest głównym celem ponownego wykorzystania komórek.