Я пытаюсь динамически вставлять элемент в свой табличный вид. В моем приложении есть раздел чата, где он отображает старые (загруженные с сервера до инициализации контроллера представления) сообщения в разделе 0 и отображает только отправленные/полученные сообщения (где он изначально нул) в разделе 1. Когда загрузка загружается, все "старые" сообщения загружаются и отображаются, никаких проблем нет. Проблема начинается, когда я пытаюсь вставить строки. Вот что я делаю:
- Я сначала обновляю свой источник данных таблицы, добавляя дополнительный элемент:
[newMessages addObject:newMessage];
(newMessage - это экземпляр моего настраиваемого объекта сообщения, а newMessages - мой источник данных). Я проверяю, что у моего источника данных теперь есть 1 элемент (который был добавлен до 0). -
Затем я вызываю следующий код:
[self.chatTableView beginUpdates]; [self.chatTableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:newMessages.count - 1 inSection:1]] withRowAnimation:UITableViewRowAnimationBottom]; [self.chatTableView endUpdates];
Мое приложение разбивается на метод endUpdates
, давая мне эту ошибку: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
Я сразу же проверил, есть ли newMessage
nil
или нет, он не nil
(и повторно проверил мой источник данных), поэтому источник данных не является проблемой. Я думал, что проблема indexPathForRow:newMessages.count - 1
может быть проблемой, и попробовал разные значения (count - 2, count, count + 1) на всякий случай, если я что-то упустил. В таких случаях я получаю еще одну ошибку: 'NSInternalInconsistencyException', reason: 'attempt to insert row 1 into section 1, but there are only 1 rows in section 1 after the update'
. Ошибка говорит обо всем, поэтому проблема не в том, чтобы с indexPathForRow:newMessages.count - 1
.
Я добавил точки останова в метод -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
, чтобы увидеть, когда он точно вызван и что он возвращает. Похоже, что метод вообще не вызывается, точка останова не попадает (он срабатывает, когда представление сначала загружается и загружает исходные данные правильно, и я не устанавливаю источник данных нигде, поэтому также связаны делегаты/источники данных правильно). Сразу же я проверил другие методы:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if(section == 0){
return @"Eski mesajlar";
}else{
return @"Yeni mesajlar";
}
}
Эти методы возвращают правильные значения. Я поставил точку останова в -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
, чтобы увидеть, когда она вызвана. По-видимому, он вызван внутри метода [self.chatTableView endUpdates];
(как видно из стека вызовов потока/очереди), но затем [self.chatTableView endUpdates];
сразу же выдает ошибку, даже не введя метод -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
. Я видел примеры (и некоторые другие), такие как:
- как правильно использовать insertRowsAtIndexPaths?
- Ошибка создания строки в представлении таблицы
- Добавить ячейку внизу UITableView в iOS
- Сбой при просмотре таблиц при перемещении более половины ячеек в другой раздел
Я читал ответы там, но никто из них не помог мне. Что я делаю неправильно?