NSInternalInconsistencyException ', причина: "попытаться вставить строку 0 в раздел 0, но в разделе 0 после обновления есть только 0 строк",
Я использую UITableViewController и получаю эту ошибку при обновлении tableView. Ниже мой код:
Это происходит, когда я делаю событие click:
[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];
Я пробовал искать документацию на Apple, но это не помогло.
Спасибо,
Абы
Ответы
Ответ 1
Я столкнулся с этой проблемой раньше. Это означает, что когда -insertRowsAtIndexPaths:withRowAnimation:
был вызван -tableView:numberOfRowsInSection:
, возвращенный 0. Вам нужно вставить в модель до вызова -insertRowsAtIndexPaths:withRowAnimation:
(см. -beginUpdates
)
Обновление
Интересно, что такое возвращаемое значение -tableView:numberOfRowsInSection:
? Кроме того, вам не нужно -beginUpdates
/-endUpdates
, если у вас есть только одно обновление.
[timeZoneNames insertObject:@"HELLO" atIndex:0];
// Let 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];
Ответ 2
Я столкнулся с этой ошибкой, когда я забыл правильно установить источник данных.
Если вы видите эту ошибку, убедитесь, что вы явно задали делегат TableView и источник данных:
-
перейдите к построителю интерфейса и посмотрите на представление с помощью "Просмотр таблицы"
-
cmd + перетаскивание вправо (вы должны увидеть синюю линию) из значка "Вид таблицы" на значок заголовка для файла, рядом с ним находится значок xcode 6.
-
отпустите кнопку мыши, вы должны увидеть параметры делегата и источника данных.
-
выберите 'datasource'
Ваша таблица должна быть правильно подключена.
Ответ 3
Я попробовал распечатать, сколько строк и разделов было фактически в таблицеView во время обновления, которое заставило меня задуматься, сколько секций я возвращаю в методе источника данных табличного представления... и это было преступником:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 0;
}
Убедитесь, что вы возвращаете 1, а не 0.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
По крайней мере, это решило проблему для меня...
UPDATE:
У меня снова возникает проблема после того, как она работает некоторое время. Я немного изменил приложение. Мое первое представление - tableView, и когда вы нажимаете кнопку "плюс" в правом верхнем углу, вы получаете другую таблицу, в которой вы можете вводить информацию. Когда вы нажмете кнопку "Готово", информация добавляется в модель Core Data с помощью этого кода:
- (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];
}
И я подтвердил, что он успешно попал в модель Core Data, напечатав на консоли следующее в моем методе viewDidAppear после возвращения на первый экран.
-(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];
И тогда мой метод addEvent делает это:
- (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){
}
}
Любая идея, в чем проблема на этот раз??? Спасибо!
Ответ 4
Отметьте эту "попытку вставить строку 0 в раздел 0, но после обновления только 0 строк в разделе 0".
Это означает, что когда вы вставляете объект в строку 0, раздел 0, никаких разделов нет.
Попробуйте вставить раздел перед вставкой строки.
[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];