2012-07-29 5 views
35

Ich verwende UITableViewController und erhalte diesen Fehler beim Aktualisieren von TableView. Unten ist mein Code:NSInternalInconsistencyException ', Grund:' Versuch, Zeile 0 in Abschnitt 0 einzufügen, aber nach dem Update gibt es nur 0 Zeilen in Abschnitt 0 '

Dies geschieht, wenn ich ein Click-Ereignis zu tun:

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
[self.tableView beginUpdates]; 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableView endUpdates]; 

ich für Apple-Dokumentation versucht, Blick aber nur knapp sein Ziel geholfen.

Danke, Aby

Antwort

27

Ich habe, bevor er in dieses Problem lief. Es bedeutet, dass, wenn -insertRowsAtIndexPaths:withRowAnimation: genannt wurde -tableView:numberOfRowsInSection: 0 zurückgegeben Sie müssen in das Modell eingefügt werden, bevor Sie -insertRowsAtIndexPaths:withRowAnimation: aufrufen (siehe: -beginUpdates)


aktualisieren

Ich frage mich, was der Rückgabewert von -tableView:numberOfRowsInSection: ist ? Außerdem benötigen Sie nicht -beginUpdates/-endUpdates, wenn Sie nur ein Update haben.

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
// Let's see what the tableView claims is the the number of rows. 
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]); 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
+0

i bereits das tat .. [timeZoneNames insert: @ "HALLO" atIndex: 0]; Anzahl der Zeilen sind immer mehr als 1. Noch bekomme ich diesen Fehler .. – insomiac

+0

Rückgabetyp von numberOfRowsInSection ist [timeZoneNames count]; Ist es in Ordnung, insertRowsAtIndexPaths ohne beginUpdates und endUpdates zu verwenden? – insomiac

+0

@Aby Von "-beginUpdates" -Dokumentation: "Rufen Sie diese Methode auf, wenn nachfolgende Einfüge-, Lösch- und Auswahlvorgänge (z. B. cellForRowAtIndexPath: und indexPathsForVisibleRows) gleichzeitig animiert werden sollen." Es wird verwendet, um mehrere UI-Vorgänge in einem einzigen UI-Vorgang zu gruppieren: Sie haben nur einen Vorgang. –

4

ich ausprobiert Druck, wie viele Zeilen und Abschnitte in der Tableview während des Update tatsächlich waren, die mich habe zu denken, wie viele Abschnitte bin ich in der Tabellenansicht Datenquelle Methode zurückkehren ... und das war der Täter :

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 0; 
} 

Stellen Sie sicher, 1 zurückkehren und nicht 0.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

mindestens gelöst das Problem für mich ...

UPDATE:

ich wieder das gleiche Problem bin, nachdem es eine Zeit lang arbeitet. Ich hatte die App ein wenig modifiziert. Meine erste Ansicht ist eine TableView und wenn Sie auf die Plus-Schaltfläche oben rechts klicken, erhalten Sie eine weitere Tabelle, in die Sie Informationen eingeben können. Wenn Sie auf Fertig klicken, werden die Informationen zum Modell Core Data hinzugefügt mit diesem Code:

- (IBAction)doneButtonPressed:(UIBarButtonItem *)sender 
{ 

MoneyBadgeAppDelegate *appDelegate = 
[[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = 
[appDelegate managedObjectContext]; 
NSManagedObject *newMoment; 
newMoment = [NSEntityDescription 
      insertNewObjectForEntityForName:@"SpendingMoment" 
      inManagedObjectContext:context]; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"yyyyMMdd"]; 
NSDate *modifiedDate = [dateFormat dateFromString: self.dateTextField.text]; 

[newMoment setValue: modifiedDate forKey:@"date"]; 
[newMoment setValue: descTextField.text forKey:@"desc"]; 

[appDelegate.eventsArray insertObject:newMoment atIndex:0]; 

NSError *error; 
[context save:&error]; 

[self dismissViewControllerAnimated:YES completion:nil]; 

} 

Und ich bestätigte es in das Core Data-Modell durch das Drucken auf die Konsole des folgend in meiner viewDidAppear Methode erfolgreich gesetzt wird bei der Rückkehr zurück zum ersten Bildschirm.

-(void)viewDidAppear:(BOOL)animated{ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SpendingMoment" 
inManagedObjectContext:self.managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:entity]; 

NSError *error; 
NSArray *items = [self.managedObjectContext 
        executeFetchRequest:fetchRequest error:&error]; 

for (SpendingMoment *moment in items) { 
    NSLog(@"Date: %@, Desc: %@", [moment date], [moment desc]); 
} 

[self addEvent]; 

Und dann hat mein addEvent Methode dies:

- (void)addEvent { 

[self.tableScreen beginUpdates]; 

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.tableScreen insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 


[self.tableScreen reloadData]; 
[self.tableScreen endUpdates]; 

@try{ 
    [self.tableScreen scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
@catch(NSException *exception){ 
} 

}

Jede Idee, was das Problem diesmal ist ??? Vielen Dank!

+0

Sie sollten 'reloadData' niemals in einen 'beginUpdates'-Block einfügen. Diese beiden Dinge schließen sich gegenseitig aus – iwasrobbed

22

Dieser Fehler ist aufgetreten, als ich vergessen habe, den Datenquellenausgang richtig einzustellen.

Wenn Sie diesen Fehler sehen, dass Sie eingestellt haben ausdrücklich Ihre Tableview Delegierten und Datenquelle:

  • zu Ihrem Interface Builder gehen und mit dem ‚Table View‘

  • im Blick aussehen

    cmd + Rechtsklick ziehen (Sie sollten eine blaue Linie sehen) aus dem "Table View" -Symbol auf das Titelsymbol für die Datei, dies hat ein gelbes Symbol neben ihm in xcode 6.

  • Lassen Sie Ihre Maus, Sie sollte Delegat und da sehen Tasource-Optionen.

  • select 'Datenquelle'

Tisch jetzt richtig verdrahtet werden sollte.

+3

löste es für mich –

+0

dieser Weg war richtig für mich. Müssen nur Kabel zwischen Datenquelle und Tabelle !!!! Und zwischen Delegierten und Tabelle !!!. Controller nicht anzeigen. Aber mit Tabelle. –

0

Überprüfen Sie diese "Versuch, Zeile 0 in Abschnitt 0 einzufügen, aber es gibt nur 0 Zeilen in Abschnitt 0 nach der Aktualisierung".

Es mesns, wenn Sie Objekt in Zeile 0, Abschnitt 0 einfügen, gibt es keine Abschnitte. Versuchen Sie, einen Abschnitt einzufügen, bevor Sie eine Zeile einfügen.

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
NSLog(@"sections: %lu ",[self.downlaodTableView numberOfSections]; 
// insert section 
[self.tableView insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)] withRowAnimation:UITableViewRowAnimationNone]; 
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]); 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
Verwandte Themen