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];