Also habe ich einen RSS-Reader für meine Schule erstellt und den Code fertiggestellt. Ich habe den Test ausgefü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 ITableView 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 Cell kann nicht aus der Warteschlange entfernt werden schließen Sie einen Prototyp Zelle in einem Storyboard‘--- [* 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: Beendet einen Aufruf
und hier ist der Code, der auf dem Fehlerbildschirm angezeigt wird:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
bitte hilf!
Sie verwenden die Methode dequeueReusableCellWithIdentifier:forIndexPath:
. Die Dokumentation für diese Methode sagt dies:
Wichtig: Sie müssen eine Klassen- oder NIB-Datei mit der Methode
registerNib:forCellReuseIdentifier:
OderregisterClass:forCellReuseIdentifier:
Registrieren, bevor Sie diese Methode aufrufen.
Sie haben keine Schreibfeder oder Klasse für die Wiederverwendungskennung "Cell"
Registriert.
Wenn Sie Ihren Code betrachten, erwarten Sie anscheinend, dass die Methode dequeue nil
zurückgibt, wenn keine Zelle vorhanden ist. Sie müssen den dequeueReusableCellWithIdentifier:
Für dieses Verhalten verwenden:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Beachten Sie, dass dequeueReusableCellWithIdentifier:
Und dequeueReusableCellWithIdentifier:forIndexPath:
Unterschiedliche Methoden sind. Siehe doc für das erstere und das letztere .
Wenn Sie verstehen möchten, warum Sie jemals dequeueReusableCellWithIdentifier:forIndexPath:
Verwenden möchten, lesen Sie diese Fragen und Antworten .
Ich denke, bei diesem Fehler geht es darum, Ihre Schreibfeder oder Klasse für den Bezeichner zu registrieren.
Damit Sie behalten können, was Sie in Ihrer tableView tun: cellForRowAtIndexPath-Funktion und fügen Sie einfach den folgenden Code in Ihre viewDidLoad ein:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
Es hat für mich funktioniert. Hoffe, es kann helfen.
Obwohl diese Frage ziemlich alt ist, gibt es eine andere Möglichkeit: Wenn Sie Storyboards verwenden, müssen Sie einfach den CellIdentifier im Storyboard einstellen.
Wenn Ihr CellIdentifier "Cell" ist, setzen Sie einfach die Eigenschaft "Identifier":
Stellen Sie sicher, dass Sie Ihren Build danach bereinigen. XCode hat manchmal Probleme mit Storyboard-Updates
ich hatte das gleiche Problem mit zu ersetzen
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
gelöst
Das Problem liegt höchstwahrscheinlich daran, dass Sie benutzerdefiniertes UITableViewCell
im Storyboard konfigurieren, jedoch nicht das Storyboard zum Instanziieren Ihres UITableViewController
verwenden, das dieses UITableViewCell
verwendet. In MainStoryboard haben Sie beispielsweise eine UITableViewController
-Unterklasse mit dem Namen MyTableViewController
und eine benutzerdefinierte dynamische UITableViewCell
mit dem Namen MyTableViewCell
mit der ID "MyCell".
Wenn Sie Ihr benutzerdefiniertes UITableViewController
wie folgt erstellen:
MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];
Ihre benutzerdefinierte Tabellenzelle wird nicht automatisch für Sie registriert. Sie müssen es manuell registrieren.
Aber wenn Sie Storyboard verwenden, um MyTableViewController
zu instanziieren, wie folgt:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyTableViewController"];
Schöne Sache passiert! UITableViewController
registriert automatisch Ihre benutzerdefinierte Tabellenzelle, die Sie im Storyboard für Sie definiert haben.
In Ihrer Delegatmethode "cellForRowAtIndexPath" können Sie Ihre Tabellensichtzelle folgendermaßen erstellen:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//Configure your cell here ...
return cell;
}
dequeueReusableCellWithIdentifier erstellt automatisch eine neue Zelle für Sie, wenn die Recyclingwarteschlange keine wiederverwendbare Zelle enthält.
Dann sind Sie fertig!
Ich werde nur hinzufügen, dass Xcode 4.5 die neue dequeueReusableCellWithIdentifier:forIndexPath:
in seinem Standardvorlagencode - ein potenzielles Problem für Entwickler, die die ältere Methode dequeueReusableCellWithIdentifier:
erwarten.
Sie müssen in Ihrem Attributinspektor einen Namen für Ihre Zellen hinzufügen.
Dann müssen Sie Ihren Bezeichner wie folgt mit Ihrer Warteschlange abgleichen:
let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell
Alternativ
Wenn Sie mit einer Schreibfeder arbeiten, müssen Sie Ihre Klasse möglicherweise in Ihrem cellForRowAtIndexPath registrieren:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")
// included for context
let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell
//... continue
}
In der UITableView-Klassenreferenz von Apples heißt es:
Rufen Sie vor dem Löschen von Zellen diese Methode oder die Methode registerNib: forCellReuseIdentifier: auf, um der Tabellenansicht mitzuteilen, wie neue Zellen erstellt werden sollen. Befindet sich eine Zelle des angegebenen Typs derzeit nicht in einer Wiederverwendungswarteschlange, erstellt die Tabellenansicht anhand der bereitgestellten Informationen automatisch ein neues Zellenobjekt.
Wenn Sie zuvor eine Klasse oder eine NIB-Datei mit derselben Wiederverwendungskennung registriert haben, ersetzt die im Parameter cellClass angegebene Klasse den alten Eintrag. Sie können nil für cellClass angeben, wenn Sie die Registrierung der Klasse für die angegebene Wiederverwendungskennung aufheben möchten.
Hier ist der Code von Apples Swift 2.0 Framework:
// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.
@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)
@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
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.
Arbeiten mit Swift 3.0:
override func viewDidLoad() {
super.viewDidLoad()
self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell
return cell
}
Wenn Sie mit benutzerdefinierten statischen Zellen arbeiten, kommentieren Sie einfach diese Methode:
//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// static NSString *CellIdentifier = @"notificationCell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// return cell;
//}
geben Sie den Zellen einen Bezeichner unter "Attributes Inspector" im Storyboard.
Ich gebe Ihnen die Antwort sowohl in Ziel C als auch in Swift. Vorher möchte ich sagen
Wenn wir das
dequeueReusableCellWithIdentifier:forIndexPath:
, müssen wir eine Klassen- oder NIB-Datei mit der Methode registerNib: forCellReuseIdentifier: oder registerClass: forCellReuseIdentifier: registrieren, bevor wir diese Methode als Apple Documnetation Says aufrufen
Also fügen wir registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:
Nachdem wir eine Klasse für den angegebenen Bezeichner registriert haben und eine neue Zelle erstellt werden muss, initialisiert diese Methode die Zelle, indem sie die Methode initWithStyle: reuseIdentifier: aufruft. Bei nib-basierten Zellen lädt diese Methode das Zellenobjekt aus der bereitgestellten nib-Datei. Wenn eine vorhandene Zelle zur Wiederverwendung verfügbar war, ruft diese Methode stattdessen die prepareForReuse-Methode der Zelle auf.
in der viewDidLoad-Methode sollten wir die Zelle registrieren
Ziel C
OPTION 1:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
OPTION 2:
[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];
im obigen Code nibWithNibName:@"CustomCell"
Geben Sie Ihren Spitzennamen anstelle meines Spitzennamens CustomCell an
Swift
OPTION 1:
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
OPTION 2:
tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell")
im obigen Code nibName:"NameInput"
Gib den Namen deiner Feder an
Ich habe alles korrekt im Storyboard eingerichtet und einen sauberen Build durchgeführt, aber es wurde weiterhin die Fehlermeldung "muss eine Schreibfeder oder eine Klasse für den Bezeichner registrieren oder eine Prototypzelle in einem Storyboard verbinden" angezeigt.
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
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 Delegaten und Datenquelle deklariert und sichergestellt, dass die Zellenkennung in der Datei übereinstimmt. was ist hier los?
FWIW, ich habe die gleiche Fehlermeldung erhalten, als ich vergessen habe, die Zellenkennung im Storyboard festzulegen. Wenn dies Ihr Problem ist, klicken Sie im Storyboard auf die Tabellenzelle und legen Sie die Zellenkennung im Attributeditor fest. Stellen Sie sicher, dass die hier eingestellte Zellenkennung mit der übereinstimmt
static NSString *CellIdentifier = @"YourCellIdenifier";
Ich hatte das gleiche Problem, hatte den gleichen Fehler und bei mir hat es so funktioniert:
[self.tableView registerNib:[UINib nibWithNibName:CELL_NIB_HERE bundle: nil] forCellReuseIdentifier:CELL_IDENTIFIER_HERE];
Vielleicht ist es für jemand anderen nützlich.
Ich habe letzte Nacht Stunden damit verbracht, herauszufinden, warum meine programmgesteuert generierte Tabelle auf [myTable setDataSource: self] abgestürzt ist. Das Auskommentieren und Auftauchen einer leeren Tabelle war in Ordnung, stürzte jedoch jedes Mal ab, wenn ich versuchte, die Datenquelle zu erreichen.
Ich hatte die Delegation in der h-Datei eingerichtet: @interface myViewController: UIViewController
Ich hatte den Datenquellcode in meiner Implementierung und immer noch BOOM !, jedes Mal abstürzen! 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:
- (IBAction)tapButton:(id)sender {
UIViewController* popoverContent = [[UIViewController alloc]init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
popoverView.backgroundColor = [UIColor greenColor];
popoverContent.view = popoverView;
//Add the table
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300) style:UITableViewStylePlain];
// NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when tapping the button!
[table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
table.delegate=self;
[table setDataSource:self];
[popoverView addSubview:table];
popoverContent.contentSizeForViewInPopover =
CGSizeMake(200, 300);
//create a popover controller
popoverController3 = [[UIPopoverController alloc]
initWithContentViewController:popoverContent];
CGRect popRect = CGRectMake(self.tapButton.frame.Origin.x,
self.tapButton.frame.Origin.y,
self.tapButton.frame.size.width,
self.tapButton.frame.size.height);
[popoverController3 presentPopoverFromRect:popRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
#Table view data source in same m file
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"Sections in table");
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Rows in table");
// Return the number of rows in the section.
return myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSString *myValue;
//This is just some test array I created:
myValue=[myArray objectAtIndex:indexPath.row];
cell.textLabel.text=myValue;
UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
cell.textLabel.font = myFont;
return cell;
}
Ü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.
Stellen Sie sicher, dass der CellIdentifier == Bezeichner der Zelle in einem Storyboard beide Namen identisch sind. Hoffe, das funktioniert für Sie
Das mag manchen Leuten dumm vorkommen, hat mich aber erwischt. Ich bekam diesen Fehler und das Problem für mich war, dass ich versuchte, statische Zellen zu verwenden, aber dann dynamisch mehr Zeug hinzufügte. Wenn Sie diese Methode aufrufen, müssen Ihre Zellen dynamische Prototypen sein. Wählen Sie die Zelle im Storyboard und im Attribut-Inspektor als Erstes "Inhalt" aus. Wählen Sie dann dynamische Prototypen aus, die nicht statisch sind.
In Swift kann dieses Problem gelöst werden, indem Sie den folgenden Code in Ihren Code einfügen
viewDidLoad
methode.
tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")
In meinem Fall passierte der Absturz, als ich deselectRowAtIndexPath:
Anrief.
Die Zeile war [tableView deselectRowAtIndexPath:indexPath animated:YES];
Ändern in [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
MEIN PROBLEM BEHOBEN!
Hoffe das hilft jedem