Zrobiłem więc czytnik rss dla mojej szkoły i ukończyłem kod. Uruchomiłem test i dał mi ten błąd. Oto kod, którego dotyczy:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
if (cell == nil) {
cell =
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier];
}
oto błąd w danych wyjściowych:
2012-10-04 20: 13: 05.356 Czytnik [4390: c07] * Błąd asercji w - [UITableView dequeueReusableCellWithIdentifier: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04 20: 13: 05.357 Reader [4390: c07] * Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „niezdolność do usunięcia z komórki komórki z identyfikatorem Komórka - musi zarejestrować stalówkę lub klasę dla identyfikatora lub połączyć prototypową komórkę w serii ujęć „ * Pierwsze połączenie rzut stos (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935 ) libc ++ abi.dylib: terminate zwane zgłaszaniem wyjątku
a oto kod wyświetlany na ekranie błędu:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
proszę pomóż!
źródło
Odpowiedzi:
Używasz tej
dequeueReusableCellWithIdentifier:forIndexPath:
metody. Dokumentację dla tej metody mówi w ten sposób:Nie zarejestrowałeś stalówki ani klasy dla identyfikatora ponownego wykorzystania
"Cell"
.Patrząc na twój kod, wydaje się, że spodziewasz się, że metoda dequeue zwróci,
nil
jeśli nie ma komórki, która mogłaby ci dać. Musisz użyćdequeueReusableCellWithIdentifier:
do tego zachowania:Zauważ, że
dequeueReusableCellWithIdentifier:
idequeueReusableCellWithIdentifier:forIndexPath:
są to różne metody. Zobacz dokument dla pierwszego i drugiego .Jeśli chcesz zrozumieć, dlaczego chcesz kiedykolwiek używać
dequeueReusableCellWithIdentifier:forIndexPath:
, sprawdź poniższe pytania i odpowiedzi .źródło
dequeueReusableCellWithIdentifer:forIndexPath:
(Wprowadzony w iOS6) to niezłe ulepszenie, ponieważ nie trzeba sprawdzać, czy komórka jest zerowa. (TakUITableViewController
działa podobnie doUICollectionView
) Ale tak, denerwujące, że ta zmiana nie jest komentarzem w szablonie i że komunikat potwierdzenia / awarii nie jest bardziej pomocny.dequeueReusableCellWithIdentifier:forIndexPath:
kiedy powinienem byłdequeueReusableCellWithIdentifier:
.Myślę, że ten błąd dotyczy rejestracji stalówki lub klasy dla identyfikatora.
Abyś mógł zachować to, co robisz w swojej tableView: funkcja cellForRowAtIndexPath i po prostu dodaj kod poniżej do viewDidLoad:
To zadziałało dla mnie. Mam nadzieję, że to może pomóc.
źródło
viewDidLoad
i przeniesienie tej logiki doviewDidAppear
jej naprawienia.Chociaż to pytanie jest dość stare, istnieje jeszcze jedna możliwość: jeśli używasz Storyboard, po prostu musisz ustawić CellIdentifier w Storyboard.
Jeśli więc CellIdentifier to „Cell”, po prostu ustaw właściwość „Identifier”:
Pamiętaj, aby wyczyścić kompilację po wykonaniu tej czynności. XCode czasami ma pewne problemy z aktualizacjami Storyboard
źródło
Identifier
nieruchomości. Dzięki!miałem ten sam problem z zastąpieniem
rozwiązany
źródło
Problem jest najprawdopodobniej, ponieważ konfigurujesz niestandardową
UITableViewCell
w scenorysie, ale nie używasz scenorysu do tworzenia instancji,UITableViewController
która korzysta z tegoUITableViewCell
. Na przykład, w MainStoryboard maszUITableViewController
podklasę o nazwieMyTableViewController
i posiada własny dynamikęUITableViewCell
nazwieMyTableViewCell
z identyfikatorem id „MyCell”.Jeśli utworzysz niestandardowy w
UITableViewController
ten sposób:Nie zarejestruje automatycznie Twojej niestandardowej komórki widoku tabeli. Musisz go ręcznie zarejestrować.
Ale jeśli używasz scenorysu do tworzenia instancji
MyTableViewController
, w ten sposób:Miło się dzieje!
UITableViewController
automatycznie zarejestruje dla Ciebie niestandardową komórkę widoku tabeli, którą zdefiniujesz w serii ujęć.W metodzie delegowanej „cellForRowAtIndexPath” możesz utworzyć komórkę widoku tabeli w następujący sposób:
dequeueReusableCellWithIdentifier automatycznie utworzy dla ciebie nową komórkę, jeśli w kolejce recyklingu nie będzie dostępna komórka wielokrotnego użytku.
To koniec!
źródło
instantiateViewControllerWithIdentifier
do zainicjowania mojego viewController uratowało mi dzień!Dodam tylko, że Xcode 4.5 zawiera nowy
dequeueReusableCellWithIdentifier:forIndexPath:
w domyślnym kodzie szablonu - potencjalną gotcha dla programistów oczekujących starszej
dequeueReusableCellWithIdentifier:
metody.źródło
W swojej serii ujęć powinieneś ustawić „Identyfikator” swojej prototypowej komórki, aby był taki sam jak Twój „Cell” CellReuseIdentifier. Wtedy nie dostaniesz tej wiadomości ani nie będziesz musiał wywoływać funkcji registerClass:.
źródło
Rozwiązanie Swift 2.0:
Musisz przejść do Inspektora atrybutów i dodać nazwę swojej komórki Identyfikator:
Następnie musisz dopasować swój identyfikator do dequeue w następujący sposób:
Alternatywnie
Jeśli pracujesz ze stalówką, może być konieczne zarejestrowanie swojej klasy w cellForRowAtIndexPath:
Odwołanie do klasy UITableView firmy Apple mówi:
Oto kod z frameworka Apples Swift 2.0:
źródło
SwitchCell.self
pochodzi?UITableViewCell.self
wydaje się działać dla mnie. Może dodaj notatkę w odpowiedziJeśli korzystasz z niestandardowych komórek statycznych, po prostu skomentuj tę metodę:
i nadaj komórkom identyfikator w „Inspektorze atrybutów” w serii ujęć.
źródło
Daję ci odpowiedź zarówno w Celu C, jak i Swifcie, zanim to powiem
Więc dodajemy
registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:
w metodzie viewDidLoad powinniśmy zarejestrować komórkę
Cel C
OPCJA 1:
OPCJA 2:
w powyższym kodzie
nibWithNibName:@"CustomCell"
podaj nazwę stalówki zamiast mojej nazwy stalówki CustomCellSZYBKI
OPCJA 1:
OPCJA 2:
w powyższym kodzie
nibName:"NameInput"
podaj nazwę swojej stalówkiźródło
Praca z Swift 3.0:
źródło
Wczoraj spędziłem godziny, zastanawiając się, dlaczego moja programowo wygenerowana tabela uległa awarii na [myTable setDataSource: self]; Komentowanie i wyskakiwanie pustej tabeli było w porządku, ale zawieszało się za każdym razem, gdy próbowałem dotrzeć do źródła danych;
Delegację skonfigurowałem w pliku h: @interface myViewController: UIViewController
Miałem kod źródłowy danych w mojej implementacji i nadal BOOM !, awaria za każdym razem! DZIĘKUJEMY za „xxd” (nr 9): dodanie tej linii kodu rozwiązało to dla mnie! W rzeczywistości uruchamiam tabelę za pomocą przycisku IBAction, więc oto mój pełny kod:
Nawiasem mówiąc: przycisk musi być połączony z jako IBAction i jako IBOutlet, jeśli chcesz zakotwiczyć do niego popover.
UIPopoverController * popoverController3 jest zadeklarowany w pliku H bezpośrednio po @interface między {}
źródło
FWIW, dostałem ten sam błąd, gdy zapomniałem ustawić identyfikator komórki w serii ujęć. Jeśli to jest twój problem, w serii ujęć kliknij komórkę widoku tabeli i ustaw identyfikator komórki w edytorze atrybutów. Upewnij się, że ustawiony tutaj identyfikator komórki jest taki sam jak
źródło
Miałem ten sam problem, miałem ten sam błąd i dla mnie działało to tak:
Może przyda się komuś innemu.
źródło
Ustawiłem wszystko poprawnie w serii ujęć i wykonałem czystą kompilację, ale wciąż pojawiał się błąd „ muszę zarejestrować stalówkę lub klasę dla identyfikatora lub podłączyć prototypową komórkę w serii ujęć ”
Poprawiono błąd, ale wciąż mam stratę. Nie używam „niestandardowej komórki”, tylko widok z osadzonym widokiem tabeli. Zadeklarowałem kontroler widoku jako delegat i źródło danych i upewniłem się, że identyfikator komórki pasuje do pliku. co tu się dzieje?
źródło
To może wydawać się głupie dla niektórych osób, ale mnie zrozumiało. Otrzymywałem ten błąd i problem polegał na tym, że próbowałem użyć komórek statycznych, ale dynamicznie dodawałem więcej rzeczy. Jeśli wywołujesz tę metodę, twoje komórki muszą być dynamicznymi prototypami. Wybierz komórkę w serii ujęć i pod Inspektorem atrybutów, pierwsza rzecz mówi „Treść” i powinieneś wybrać dynamiczne prototypy, które nie są statyczne.
źródło
Tylko uzupełnienie odpowiedzi: może być czas, aby wszystko dobrze ustawić, ale możesz przypadkowo dodać do ciebie kilka innych interfejsów użytkownika
.xib
, takich jakUIButton
: Wystarczy usunąć dodatkowy interfejs, to działa.źródło
Upewnij się, że CellIdentifier == identyfikator komórki w serii ujęć, obie nazwy są takie same. Mam nadzieję, że to zadziała u ciebie
źródło
W moim przypadku do awarii doszło, kiedy zadzwoniłem
deselectRowAtIndexPath:
Linia była
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Zmieniając go na
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
FIXED MY PROBLEM!Mam nadzieję, że to pomoże każdemu
źródło
W Swift ten problem można rozwiązać, dodając następujący kod do swojego
metoda.
źródło
Wystąpił ten błąd Identyfikator ponownego użycia komórki bc był niepoprawny - błąd nowicjusza, ale zdarza się: 1. Sprawia, że identyfikator ponownego użycia komórki SURE nie ma błędów ortograficznych ani brakujących liter. 2. W tym samym wierszu nie zapomnij o liczeniu wielkich liter. 3. Zera nie są „O” (Ohs)
źródło