wake-up-neo.com

Assertionsfehler in dequeueReusableCellWithIdentifier: forIndexPath:

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!

320
Nick Scottman

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: Oder registerClass: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 .

487
rob mayoff

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.

137
user843910

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": enter image description here

Stellen Sie sicher, dass Sie Ihren Build danach bereinigen. XCode hat manchmal Probleme mit Storyboard-Updates

67

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

59
iMeMyself

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!

25
James Wang

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.

19
Brian Shriver

Swift 2.0-Lösung:

Sie müssen in Ihrem Attributinspektor einen Namen für Ihre Zellen hinzufügen.

enter image description here

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)
18
Dan Beaulieu

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.

18
Steven

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
}
3
norbDEV

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

3
user3182143

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?

2
FrostyL

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";
2
honkskillet

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.

2
CarmenA

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.

2
Simone

Nur eine Ergänzung der Antworten: Es kann vorkommen, dass Sie alles richtig einstellen, aber Sie können versehentlich einige andere Benutzeroberflächen in Ihrem .xib Hinzufügen, z. B. ein UIButton: enter image description here Löschen Sie einfach die zusätzliche Benutzeroberfläche, es funktioniert.

1
DrustZ

Stellen Sie sicher, dass der CellIdentifier == Bezeichner der Zelle in einem Storyboard beide Namen identisch sind. Hoffe, das funktioniert für Sie

1
Ankit garg

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.

1
Chase Roberts

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")
0
arango_86

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

0
Offek