Сбой добавления строки в UITableView при изначально пустой таблице

#uitableview #row #add

#uitableview #строка #Добавить

Вопрос:

Я использую приведенный ниже код для обновления tableview, в который я только что добавил строку. Код работает для добавления строки в таблицу, если в таблице уже есть хотя бы 1 строка. Однако происходит сбой, если изначально таблица была пустой.

 NSArray *indexPaths = [NSArray arrayWithObjects: [NSIndexPath indexPathForRow:[commentsArray count] inSection:0], nil];

[commentsTableView beginUpdates];

[commentsArray addObject:newestEntry];
[commentsTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationBottom];

[commentsTableView endUpdates];

[commentsTableView scrollToBottom:YES];
  

Ответ на сбой, который я получаю, это:

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted).'
  

Кто-нибудь может мне помочь?

Ответ №1:

Что ж, ошибка сообщает вам, что вызовы UIKit tableView:numberOfRowsInSection возвращаются 0 как до, так и после ваших обновлений. Итак, либо у вас ошибка в этом методе, либо в вашем обновлении. Вы сказали в комментарии к предыдущему ответу, что ваш tableView:numberOfRowsInSection правильный, тогда это должно быть обновление. Если commentsArray в первом обновлении по какой-то причине равно нулю, это может объяснить ситуацию. Возможно, попробуйте следующее:

 NSAssert(commentsArray, @"commentsArray is nil");
[commentsArray addObject:newestEntry];
  

Утверждение будет проигнорировано в сборке выпуска, поэтому используйте отладочную сборку.

Комментарии:

1. СПАСИБО, СПАСИБО. Оказывается, мой массив даже не был выделен, когда HTTP-запрос отвечает пустой строкой! Спасибо!

2. Добро пожаловать! Мне не нравится тот факт, что Objective-C позволяет вам делать что-то с nil без жалоб, поэтому после того, как меня несколько раз укусили, у меня вошло в привычку использовать NSAssert везде, где меня укусит объект nil. В последнее время меня кусают намного меньше 😉

Ответ №2:

Просто убедитесь, что массив, который вы используете для обновления, совпадает с массивом, который вы используете при перезагрузке таблицы.

// Настройте количество строк в табличном представлении.

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [commentsArray count];
}
  

Если это не помогло решить вашу проблему, пожалуйста, добавьте сюда какой-нибудь код.

Комментарии:

1. Спасибо за ваш ответ. Я не уверен, какой другой код я должен опубликовать, чтобы прояснить это .. Мой numberOfRowsInSection правильный. На самом деле я выполняю POST-запрос с помощью ASIHTTPRequest , и приведенный выше блок кода вызывается в методе делегирования успешного ответа. Процесс заключается в том, что я публикую комментарий с помощью POST, затем, когда он возвращает успех, я повторно обрабатываю ленту, добавляю новый комментарий newestEntry в commentsArray , затем обновляю commentsTableView .