2009-12-11 2 views
0

Я реализую UITableView, где количество строк для данного раздела ограничено 4. Если это так, если число строк меньше 4, я добавляю строку, которая используется в качестве заполнителя для добавления следующего элемента (это похоже на приложение «Контакты»).Раздел UITableView с максимальным количеством строк

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

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

Конечно, проблема в том, что мои numberOfRowsInSection методы возвращает N + 1, если число строк меньше, чем 4 (одна дополнительная ячейка для заполнителя), который вызывает эту непоследовательность исключение.

Есть ли вообще вокруг этого?

ответ

2

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

Способ обращения с ним просто разрешает только вызов deleteRowsAtIndexPaths в тех случаях, когда вы находитесь , изменяя количество строк в разделе.

Итак, в вашем случае вы говорите, что у меня есть четыре строки с содержимым (предположительно, хранящимся в массиве или какой-либо другой структуре данных). Я удаляю один из этих строк, но я собираюсь помещать строку-заполнитель там на своем месте. Таким образом, количество строк в разделе для целей показа на самом деле не меняется.

То, что вы хотите сделать, это удалить элемент из вашей структуры данных, чтобы при вызове cellForRowAtIndex он правильно загрузил вашу ячейку-заполнитель, но на самом деле вам не нужно пытаться удалить строку из таблицы.

В качестве альтернативы, если вы хотите получить взаимодействие с подсветкой, я бы попытался выяснить, что предлагает Ян, удалив и добавив строки в одну транзакцию. Однако я не проверял это в этой ситуации.

Я нашел, что пользовательский интерфейс выглядит довольно гладко, без дополнительных анимаций, но это зависит от вашего приложения.

2

Я думаю, что это ожидается. Когда вы говорите ему, чтобы удалить строку, она берет это буквально - она ​​хочет, чтобы эта строка исчезла. Похоже, вы просто хотите очистить строку, и в этом случае я бы назвал reloadRowsAtIndexPaths:, убедившись, что ваш источник данных знает, что эта строка теперь должна быть пустой.

Или - и это может быть лучше - вы могли бы позвонить insertRowsAtIndexPath: сразу после удаления. Это, вероятно, позволит вам немного улучшить анимацию. Просто убедитесь, что вы заключили инструкции delete и insert с операциями [tableView beginUpdates] и [tableView endUpdates].

Редактировать: просто перечитайте вопрос. Nevermind мой первый ответ, но я думаю, что мой второй ответ все равно должен работать.