2014-06-17 2 views
2

У меня есть ViewController, который создает новый объект, а затем обратно в FirstViewController.m У меня есть метод разматывания, который должен обновлять tableView с помощью строки для нового объекта. Использование метода reloadData не будет работать, поскольку оно перезагружает все ячейки, которые влияют на методы, которые у меня есть в этих ячейках. Я хотел бы просто добавить новую ячейку без перезагрузки всего tableView. Мой размотки метод выглядит следующим образом:Добавить строку в UITableView без использования reloadData

-(IBAction)unwind:(UIStoryboardSegue *)segue { 
    ABCAddItemViewController *source = [segue sourceViewController]; 
    ABCItem *item = source.object; 

    if (item != nil) { 
     [self.objectArray addObject:item]; 

     [self.tableView reloadData]; 
    } 
} 

Я попытался добавить эти строки вместо [self.tableView reloadData]:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.objectArray indexOfObject:item] inSection:0]; 
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 

Тем не менее, приложение падает, и я получаю это сообщение:

Недопустимое обновление: недопустимое количество строк в разделе 0. Количество строк , содержащихся в существующем разделе после обновления (1), должно быть , равное количеству строк, содержащихся в i в этом разделе перед обновлением (1) плюс или минус количество строк, вставленных или удаленных из , этот раздел (1 вставлен, 0 удален) и плюс или минус количество строк , перемещенных в или из этого раздела (0 переместился, 0 выехал).

Число строк в Tableview определяется [self.objectArray count] в the numberOfRowsInSection: методом.

Как это сделать? Или есть лучший способ?

+1

Вы должны обновить источник данных ('self.objectArray ') с дополнительными данными непосредственно перед вызовом' insertRowsAtIndexPath'. – rmaddy

+0

Я попытался просто заменить строку '[self.tableView reloadData]', но это вызывает ошибку, о которой я упоминал. Я добавляю объект в массив прямо до этого. – Benck

+0

Призыв к 'reloadData' не даст сообщение об ошибке. Это будет только от вызова 'insertRowsAtIndexPaths:'. BTW - вам нужно вставить строку в том же месте, где вы добавляете ее в свой массив. – rmaddy

ответ

0

Ошибка говорит о том, что обновление интерфейса ожидается 2 строки для отображения, но ваш источник данных содержит только 1 строку после обновления.

Является ли ваш объект «предметом» [NSNull null] значение?

Линия if(item != nil) может быть равна true, если элемент является значением [NSNull null].

Не могли бы вы попробовать положить эту дополнительную проверку

if(item != nil && item != [NSNull null]) 
{ 
    ... 
} 

Или использовать контрольную точку и отладчик для распечатки значения элемента:

lldb> po item 
Смежные вопросы