Also machte ich einen RSS-Reader für meine Schule und beendete den Code. Ich habe den Test durchgeführt und es gab mir diesen Fehler. Hier ist der Code, auf den es sich bezieht:
- (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];
}
Hier ist der Fehler in der Ausgabe:
2012-10-04 20: 13: 05.356 Reader [4390: c07] * Assertionsfehler in - [UITableView dequeueReusableCellWithIdentifier: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04 20: 13: 05.357 Reader [4390: c07] * Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Eine Zelle mit dem Bezeichner kann nicht aus der Warteschlange entfernt werden Zelle - muss eine Schreibfeder oder eine Klasse für den Bezeichner registrieren oder eine Prototypzelle in einem Storyboard verbinden ' * Ersten Wurf Call-Stack: (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: Beenden Sie das Auslösen einer Ausnahme
und hier ist der Code, der im Fehlerbildschirm angezeigt wird:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
bitte helfen!
quelle
Antworten:
Sie verwenden die
dequeueReusableCellWithIdentifier:forIndexPath:
Methode. In der Dokumentation zu dieser Methode heißt es:Sie haben keine Schreibfeder oder Klasse für die Wiederverwendungskennung registriert
"Cell"
.Wenn Sie sich Ihren Code ansehen, scheinen Sie zu erwarten, dass die Dequeue-Methode zurückkehrt,
nil
wenn sie keine Zelle enthält. Sie müssen FolgendesdequeueReusableCellWithIdentifier:
für dieses Verhalten verwenden:Beachten Sie, dass
dequeueReusableCellWithIdentifier:
unddequeueReusableCellWithIdentifier:forIndexPath:
verschiedene Methoden sind. Siehe doc für Ersteres und Letzteres .Wenn Sie möchten , verstehen , warum Sie jemals verwenden wollen würde
dequeueReusableCellWithIdentifier:forIndexPath:
, lesen Sie in diesem Q & A .quelle
dequeueReusableCellWithIdentifer:forIndexPath:
(in iOS6 eingeführt) ist eine nette Verbesserung, da Sie nicht überprüfen müssen, ob die Zelle Null ist. (Funktioniert alsoUITableViewController
ähnlich wieUICollectionView
) Aber ja, ärgerlich, dass diese Änderung kein Kommentar in der Vorlage ist und dass die Assertion / Crash-Meldung nicht hilfreicher ist.dequeueReusableCellWithIdentifier:forIndexPath:
indem ich verwendet habe , wann ich hätte verwenden sollendequeueReusableCellWithIdentifier:
.Ich denke, bei diesem Fehler geht es darum, Ihre Feder oder Klasse für die Kennung zu registrieren.
Damit Sie behalten, was Sie in Ihrer tableView: cellForRowAtIndexPath-Funktion tun, und einfach den folgenden Code in Ihre viewDidLoad einfügen:
Es hat bei mir funktioniert. Hoffe es kann helfen.
quelle
viewDidLoad
und verschob diese Logik, umviewDidAppear
sie zu beheben.Obwohl diese Frage ziemlich alt ist, gibt es eine andere Möglichkeit: Wenn Sie Storyboards verwenden, müssen Sie lediglich den CellIdentifier im Storyboard festlegen.
Wenn Ihr CellIdentifier also "Cell" ist, legen Sie einfach die Eigenschaft "Identifier" fest:
Stellen Sie sicher, dass Sie Ihren Build danach reinigen. XCode hat manchmal Probleme mit Storyboard-Updates
quelle
Identifier
Immobilie war die Reinigung des Gebäudes unerlässlich . Vielen Dank!Ich hatte das gleiche Problem mit zu ersetzen
gelöst
quelle
Das Problem ist höchstwahrscheinlich darauf zurückzuführen, dass Sie benutzerdefinierte Einstellungen
UITableViewCell
im Storyboard vornehmen, das Storyboard jedoch nicht zum Instanziieren des Storyboards verwenden, dasUITableViewController
dies verwendetUITableViewCell
. Zum Beispiel in MainStoryboard, haben Sie eineUITableViewController
Unterklasse genanntMyTableViewController
und haben eine dynamische benutzerdefinierteUITableViewCell
genanntMyTableViewCell
mit der Kennung id „MyCell“.Wenn Sie Ihre benutzerdefinierte
UITableViewController
wie folgt erstellen :Ihre benutzerdefinierte Tabellenansichtszelle wird nicht automatisch für Sie registriert. Sie müssen es manuell registrieren.
Wenn Sie jedoch das Storyboard zum Instanziieren verwenden
MyTableViewController
, gehen Sie wie folgt vor:Schöne Sache passiert!
UITableViewController
registriert automatisch Ihre benutzerdefinierte Tabellenansichtszelle, die Sie im Storyboard für Sie definiert haben.In Ihrer Delegatmethode "cellForRowAtIndexPath" können Sie Ihre Tabellenansichtszelle wie folgt erstellen:
dequeueReusableCellWithIdentifier erstellt automatisch eine neue Zelle für Sie, wenn in der Recycling-Warteschlange keine wiederverwendbare Zelle verfügbar ist.
Dann bist du fertig!
quelle
instantiateViewControllerWithIdentifier
dem ich meinen viewController initiiert habe, hat mir den Tag gerettet!Ich füge nur hinzu, dass Xcode 4.5 das Neue
dequeueReusableCellWithIdentifier:forIndexPath:
in seinen Standardvorlagencode einbezieht - ein potenzielles Problem für Entwickler, die die ältere
dequeueReusableCellWithIdentifier:
Methode erwarten .quelle
In Ihrem Storyboard sollten Sie den 'Identifier' Ihrer Prototypzelle so einstellen, dass er mit Ihrem CellReuseIdentifier "Cell" übereinstimmt. Dann erhalten Sie diese Nachricht nicht oder müssen diese registerClass: -Funktion aufrufen.
quelle
Swift 2.0-Lösung:
Sie müssen in Ihren Attributinspektor gehen und einen Namen für Ihre Zellen-ID hinzufügen:
Dann müssen Sie Ihre Kennung wie folgt mit Ihrer Warteschlange abgleichen:
Alternative
Wenn Sie mit einer Schreibfeder arbeiten, müssen Sie möglicherweise Ihre Klasse in Ihrem cellForRowAtIndexPath registrieren:
In der UITableView-Klassenreferenz von Apples heißt es:
Hier ist der Code aus dem Apples Swift 2.0-Framework:
quelle
SwitchCell.self
kommt?UITableViewCell.self
scheint für mich zu funktionieren. Vielleicht eine Notiz in die Antwort hinzufügenWenn Sie mit benutzerdefinierten statischen Zellen arbeiten, kommentieren Sie einfach diese Methode:
und geben Sie den Zellen eine Kennung bei "Attributes Inspector" im Storyboard.
quelle
Ich gebe Ihnen die Antwort sowohl in Ziel C als auch in Swift. Vorher möchte ich sagen
Also fügen wir hinzu
registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:
In der viewDidLoad-Methode sollten wir die Zelle registrieren
Ziel c
OPTION 1:
OPTION 2:
nibWithNibName:@"CustomCell"
Geben Sie im obigen Code Ihren Federnamen anstelle meines Spitznamens CustomCell anSCHNELL
OPTION 1:
OPTION 2:
nibName:"NameInput"
Geben Sie im obigen Code Ihren Federnamen anquelle
Arbeiten mit Swift 3.0:
quelle
Ich habe letzte Nacht Stunden damit verbracht herauszufinden, warum meine programmgesteuert generierte Tabelle auf [myTable setDataSource: self] abgestürzt ist. Es war in Ordnung, eine leere Tabelle zu kommentieren und aufzutauchen, stürzte jedoch jedes Mal ab, wenn ich versuchte, die Datenquelle zu erreichen.
Ich hatte die Delegierung in der h-Datei eingerichtet: @interface myViewController: UIViewController
Ich hatte den Datenquellcode in meiner Implementierung und stürzte immer noch jedes Mal ab! DANKE an "xxd" (Nr. 9): Das Hinzufügen dieser Codezeile hat es für mich gelöst! Tatsächlich starte ich eine Tabelle über eine IBAction-Schaltfläche. Hier ist mein vollständiger Code:
Übrigens: Die Schaltfläche muss als IBAction und als IBOutlet verknüpft sein, wenn Sie das Popover daran verankern möchten.
UIPopoverController * popoverController3 wird in der H-Datei direkt nach @interface zwischen {} deklariert
quelle
FWIW, ich habe den gleichen Fehler erhalten, als ich vergessen habe, die Zellenkennung im Storyboard festzulegen. Wenn dies Ihr Problem ist, klicken Sie im Storyboard auf die Tabellenansichtszelle und legen Sie die Zellenkennung im Attributeditor fest. Stellen Sie sicher, dass die hier festgelegte Zellenkennung mit der übereinstimmt
quelle
Ich hatte das gleiche Problem, hatte den gleichen Fehler und für mich funktionierte es so:
Vielleicht ist es für jemand anderen nützlich.
quelle
Ich habe alles im Storyboard korrekt eingerichtet und einen sauberen Build durchgeführt, aber immer wieder die Fehlermeldung "Ich muss eine Schreibfeder oder eine Klasse für die Kennung registrieren oder eine Prototypzelle in einem Storyboard verbinden " erhalten.
Der Fehler wurde behoben, aber ich bin immer noch ratlos. Ich verwende keine 'benutzerdefinierte Zelle', sondern nur eine Ansicht mit einer eingebetteten Tabellenansicht. Ich habe den Viewcontroller als Delegat und Datenquelle deklariert und sichergestellt, dass die Zellenkennung in der Datei übereinstimmt. was ist denn hier los?
quelle
Das mag manchen Leuten dumm erscheinen, aber es hat mich erwischt. Ich habe diesen Fehler erhalten und das Problem für mich war, dass ich versucht habe, statische Zellen zu verwenden, aber dann dynamisch mehr Material hinzugefügt habe. Wenn Sie diese Methode aufrufen, müssen Ihre Zellen dynamische Prototypen sein. Wählen Sie die Zelle im Storyboard aus und im Attributinspektor wird als erstes "Inhalt" angezeigt. Wählen Sie dynamische Prototypen aus, die nicht statisch sind.
quelle
Nur eine Ergänzung der Antworten: Es kann eine Zeit geben, in der Sie alles richtig eingestellt haben, aber Sie können versehentlich einige andere Benutzeroberflächen in sich hinzufügen
.xib
, wie z. BUIButton
.: Löschen Sie einfach die zusätzliche Benutzeroberfläche, es funktioniert.quelle
Stellen Sie sicher, dass der CellIdentifier == Bezeichner der Zelle in einem Storyboard beide Namen gleich sind. Hoffe das funktioniert für dich
quelle
In meinem Fall passierte der Absturz, als ich anrief
deselectRowAtIndexPath:
Die Linie war
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Ändern Sie es in
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
FIXED MY PROBLEM!Hoffe das hilft jedem
quelle
In Swift kann dieses Problem gelöst werden, indem Sie den folgenden Code in Ihre hinzufügen
Methode.
quelle
Der Fehler bei der Wiederverwendung von Zellen ist falsch - ein Anfängerfehler, aber es passiert: 1. Vergewissert sich, dass der Identifikator für die Wiederverwendung von Zellen keine Rechtschreibfehler oder fehlenden Buchstaben enthält. 2. Vergessen Sie in diesem Sinne nicht, dass die Großschreibung zählt. 3. Nullen sind keine "O" (Ohs)
quelle