В области происходит сбой приложения iOS: «Исключение rlmex», причина: «Индекс 38 выходит за рамки (должен быть меньше 38)».

#ios #swift #xcode #realm #tableview

Вопрос:

Я пишу приложение для iOS (iOS 14.4.2, Xcode 12.5.1, Realm 5.2.0).

Одна из таблиц, которую я использую, содержит ячейки, сгенерированные из массива «Результаты». Приложение загружается нормально и правильно заполняет таблицу правильным количеством ячеек, правильной информацией и т.д.

Проблема возникает, когда я удаляю ячейку из таблицы (используя конфигурацию UISwipeActionsConfiguration). Когда я распечатываю количество объектов в массиве результатов до и после действия, их количество уменьшается, как и ожидалось. (Например, если я начал с 39 пунктов, то он уменьшится до 38). Пока нижняя часть таблицы не видна, все в порядке. Однако, когда я прокручиваю до конца таблицы, как только последняя ячейка отображается в пользовательском интерфейсе, приложение завершает работу с ошибкой «Исключение RLM: индекс выходит за рамки». Дорожка стека показывает, что ошибка возникает из «метода cellForRowAt». Странно то, что область говорит, что массив результатов должен содержать на 1 МЕНЬШЕ, чем количество объектов, которые, как показано, содержатся в массиве результатов.

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

Пример 1:

  1. Загрузите таблицу с 40 предметами. (Массив результатов показывает 40 объектов). Последняя строка еще не видна, и приложение работает нормально.
  2. Проведите пальцем, чтобы удалить элемент с индексом 10. (Массив результатов показывает 39 объектов) Последняя строка еще не видна, и приложение работает нормально.
  3. Прокрутите вниз до конца таблицы. Приложение выходит из строя. Сообщение об ошибке: Terminating app due to uncaught exception 'RLMException', reason: 'Index 38 is out of bounds (must be less than 38).

Пример 2:

  1. Загрузите таблицу с 10 предметами. (Массив результатов показывает 10 объектов) Последняя строка видна, и приложение работает нормально.
  2. Проведите пальцем, чтобы удалить элемент по индексу 2. (Массив результатов показывает 9 объектов)
  3. Приложение выходит из строя. Сообщение об ошибке: Terminating app due to uncaught exception 'RLMException', reason: 'Index 8 is out of bounds (must be less than 8).

2 Вопроса:

  1. Почему говорится, что индекс конечного объекта выходит за рамки, когда он также показывает, что обновленный массив содержит именно такое количество объектов?
  2. И почему в нем говорится, что индекс должен быть меньше, чем количество объектов в обновленном массиве?
  3. Самое главное — кто-нибудь знает, в чем может быть проблема?

Я запускаю несколько таблиц в пользовательском интерфейсе одновременно с одной и той же информацией, представленной в разных порядках на основе разных параметров, но на основе этого потока (https://github.com/realm/realm-cocoa/issues/4499), это не должно быть проблемой. (Я даже попытался скрыть другие таблицы, чтобы отображалась только одна таблица, но результаты те же).

Любая помощь будет очень признательна!

Фотография обратного пути, если это поможет:

введите описание изображения здесь

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

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

2. Пара вещей; объект результатов области НЕ является массивом. У них похожие интерфейсы, но поведение совершенно другое. Результаты всегда отражают текущее состояние данных. Например, если у вас в результатах 10 задач, и вы используете Realm Studio для удаления задачи, результаты в вашем приложении будут содержать 9 объектов. Это действительно своего рода волшебство. Исходя из этого, в зависимости от того, как вы реализовали свой код и как был удален объект, будет определен ответ на этот вопрос. Вы подтверждаете свою таблицу результатами? или Массив? Используете ли вы наблюдателей для обновления базы пользовательского интерфейса на основе событий области?

Ответ №1:

Я нашел свою проблему. Я не обновлял (и не загружал ВСЕ таблицы) информацией о новой области — и это было важно — сразу после шага 2 в обоих примерах (т. Е. Как часть одного и того же действия). См.