it-swarm.com.de

NSInternalInconsistencyException ', Grund:' Versuch, Zeile in Abschnitt 0 einzufügen, aber nach der Aktualisierung sind nur Zeilen im Abschnitt '

Ich verwende UITableViewController und erhalte diesen Fehler beim Aktualisieren von tableView. Unten ist mein Code: 

Dies geschieht, wenn ich ein Klickereignis mache:

[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 habe versucht, nach Apple-Dokumentation zu suchen, aber das hat nicht geholfen.

Danke... Aby

40
insomiac

Ich bin schon früher auf dieses Problem gestoßen. Wenn -insertRowsAtIndexPaths:withRowAnimation: aufgerufen wurde, wurde -tableView:numberOfRowsInSection: zurückgegeben. Sie müssen 0 in das Modell einfügen, bevor Sie -insertRowsAtIndexPaths:withRowAnimation: aufrufen (siehe: -beginUpdates ).


Update

Ich frage mich, was der Rückgabewert von -tableView:numberOfRowsInSection: ist? Außerdem benötigen Sie -beginUpdates/-endUpdates nicht, 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];
28
Jeffery Thomas

Ich bin auf diesen Fehler gestoßen, als ich vergessen hatte, den Datenquellenausgang richtig einzustellen.

Wenn dieser Fehler angezeigt wird, überprüfen Sie, ob Sie Ihren TableView-Delegaten und Ihre Datenquelle explizit festgelegt haben: 

  • gehen Sie zu Ihrem Interface Builder und sehen Sie sich die Ansicht mit der 'Table View' an.

  • ziehen Sie mit der rechten Maustaste + Rechtsklick (Sie sollten eine blaue Linie sehen) vom Symbol 'Table View' auf das Titelsymbol der Datei. In Xcode 6 befindet sich ein gelbes Symbol daneben.

  • wenn Sie die Maus loslassen, sollten Sie die Optionen für Delegaten und Datenquellen sehen.

  • wählen Sie "Datenquelle" aus. 

ihr Tisch sollte nun korrekt verkabelt sein.

29
NiallJG

Ich habe versucht auszudrucken, wie viele Zeilen und Abschnitte sich während des Updates tatsächlich in der tableView befanden. Das brachte mich zum Nachdenken, wie viele Abschnitte ich in der Datenquellenmethode der Tabellensicht zurückgebe ...

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

Stellen Sie sicher, dass Sie 1 und nicht 0 zurückgeben.

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

Zumindest hat das das Problem für mich gelöst ...

UPDATE:

Ich habe wieder das gleiche Problem, nachdem es eine Weile gearbeitet hat. Ich hatte die App etwas verändert. Meine erste Ansicht ist eine tableView. Wenn Sie oben rechts auf die Plus-Schaltfläche klicken, erhalten Sie eine weitere Tabelle, in die Sie Informationen eingeben können. Wenn Sie auf "Fertig" klicken, werden die Informationen mit dem folgenden Code zum Kerndatenmodell hinzugefügt:

- (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 habe bestätigt, dass es erfolgreich in das Core Data-Modell eingefügt wurde, indem ich bei der Rückkehr zum ersten Bildschirm das Folgende in meiner viewDidAppear-Methode an die Konsole druckte.

-(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 tut meine addEvent-Methode folgendes:

- (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){
}

}

Irgendeine Idee, was das Problem ist? Vielen Dank!

4
Angie

Aktivieren Sie dieses Kontrollkästchen "Versuch, Zeile 0 in Abschnitt 0 einzufügen, aber nach dem Update sind in Abschnitt 0 nur 0 Zeilen vorhanden".

Wenn Sie ein Objekt in Zeile 0, Abschnitt 0 einfügen, bedeutet dies, dass keine Abschnitte vorhanden sind. __ 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];
0
ChokWah