Najważniejszą różnicą jest to, że forIndexPath:
wersja potwierdza (ulega awarii), jeśli nie zarejestrowałeś klasy lub końcówki dla identyfikatora. W takim przypadku forIndexPath:
zwracana jest starsza (nie ) wersja nil
.
Rejestrujesz klasę dla identyfikatora, wysyłając registerClass:forCellReuseIdentifier:
ją do widoku tabeli. Zarejestruj końcówkę dla identyfikatora, wysyłając registerNib:forCellReuseIdentifier:
ją do widoku tabeli.
Jeśli utworzysz widok tabeli i prototypy komórek w serii ujęć, moduł ładujący scenorys zajmie się rejestracją prototypów komórek, które zdefiniowałeś w serii ujęć.
Sesja 200 - Co nowego w Cocoa Touch z WWDC 2012 omawia (wówczas nową) forIndexPath:
wersję zaczynającą się od około 8 min 30 s. Mówi, że „zawsze otrzymasz zainicjowaną komórkę” (nie wspominając, że ulegnie awarii, jeśli nie zarejestrujesz klasy lub stalówki).
Film mówi również, że „będzie to odpowiedni rozmiar dla tej ścieżki indeksu”. Prawdopodobnie oznacza to, że ustawi rozmiar komórki przed jej zwróceniem, patrząc na własną szerokość widoku tabeli i wywołując tableView:heightForRowAtIndexPath:
metodę delegata (jeśli została zdefiniowana). Dlatego potrzebuje ścieżki indeksu.
dequeueReusableCellWithIdentifier:forIndexPath:
będzie zawsze wrócić komórkę. Wykorzystuje ponownie istniejące komórki lub tworzy nowe i zwraca, jeśli nie ma żadnych komórek.Podczas gdy tradycyjny
dequeueReusableCellWithIdentifier:
zwróci komórkę, jeśli istnieje, tj. Jeśli istnieje komórka, której można użyć ponownie, zwraca, w przeciwnym razie zwraca zero. Musiałbyś więc napisać warunek, aby również sprawdzićnil
wartość.Aby odpowiedzieć na twoje pytanie, użyj,
dequeueReusableCellWithIdentifier:
gdy chcesz obsługiwać iOS 5 i niższe wersje, ponieważdequeueReusableCellWithIdentifier:forIndexPath
jest dostępny tylko na iOS 6+Źródła: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :
źródło
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Nigdy nie zrozumiałem, dlaczego Apple stworzył nowszą metodę, dequeueReusableCellWithIdentifier: forIndexPath :. Ich dokumentacja nie jest kompletna i jest nieco myląca. Jedyną różnicą, jaką udało mi się dostrzec między tymi dwiema metodami, jest to, że starsza metoda może zwrócić zero, jeśli nie znajdzie komórki z przekazanym identyfikatorem, podczas gdy nowsza metoda ulega awarii, jeśli nie może zwrócić komórka. Obie metody gwarantują zwrócenie komórki, jeśli poprawnie ustawiłeś identyfikator i utworzysz komórkę w serii ujęć. Obie metody gwarantują również zwrócenie komórki, jeśli zarejestrujesz klasę lub xib i utworzysz komórkę w kodzie lub pliku xib.
źródło
tableView.estimateHeight
, rozmiar komórki również zostanie prawidłowo określony. Nadal nie czerpię korzyści z nowej metody.W skrócie:
Hollemans M. 2016, Rozdział 2 Lista kontrolna, IOS Apprentice (5th Edition). pp: 156.
źródło
Zalecałbym użycie obu, jeśli korzystasz z dynamicznie generowanych treści. W przeciwnym razie aplikacja może nieoczekiwanie ulec awarii. Możesz zaimplementować własną funkcję pobierania opcjonalnej komórki wielokrotnego użytku. Jeśli tak
nil
, powinieneś zwrócić pustą komórkę, która nie jest widoczna:Szybki 3
Oraz rozszerzenie zwracające pustą komórkę:
Kompletny przykład, jak go używać:
źródło