Шаблон для обновления UItableView и его источника данных после фильтрации с помощью NSPredicate - PullRequest
1 голос
/ 16 июня 2009

Кажется, это должно быть прямо. Технически я могу сделать эту работу, но если я хочу выполнить определенные анимации пользовательского интерфейса, (используя deleteRowsAtIndexPaths: withRowAnimation :) вещи становятся волосатыми. Кажется, что источник данных и пользовательский интерфейс борются за то, кто должен удалить в первую очередь. Затем я должен искусственно хранить данные для обновления пользовательского интерфейса.

Моя текущая настройка:

В моей модели:

  1. Создание многомерного NSArray для держать мои данные. (каждый вложенный массив представляет раздел).
  2. Поместите NSDictionary в каждый раздел массив для представления данных для индивидуальная ячейка.

В моем контроллере вида:

  1. Создание многомерного NSArray для держите мои контроллеры клетки (имитируя структура данных).
  2. Назначить каждый словарь модели ивара в соответствующей ячейке Контроллер.
  3. Подключите данные к ячейке

Это выводит мой UITableView на экран с правильно отображенными ячейками. Теперь, если я хочу отфильтровать данные в таблице, я делаю следующее:

В моей модели:

  1. Создать экземпляр NSPredicate.
  2. Фильтрация каждого подмассива многомерный массив.
  3. Установите флаг в каждом словаре, который находится в результатах фильтрованный массив.

В моем контроллере View:

  1. Я создаю новый многомерный NSArray. Этот массив будет содержать клеточные контроллеры данные "
  2. Проход по току Многомерный массив контроллеров. Добавьте его в новый "фильтрованный массив, если установлен флаг модели.
  3. Заменить нефильтрованный контроллер массив с новым.
  4. Обновить таблицу.

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

Для этого я добавлю еще несколько шагов к контроллеру вида:

В моем контроллере View:

  1. Я создаю новый многомерный NSArray. Этот массив будет содержать клеточные контроллеры данные "
  2. Проход по току Многомерный массив контроллеров. Добавьте его в новый "фильтрованный массив, если установлен флаг модели.
  3. Создать новый NSArray для хранения индексов подлежит удалению.
  4. Проход по току Многомерный массив контроллеров. Добавьте индекс своей ячейки к массив toBeDeleted, если его модель флаг НЕ установлен.
  5. Заменить нефильтрованный контроллер массив с новым.
  6. выполнить deleteRowsAtIndexPaths: withRowAnimationn

Пока этот метод не работает лучше всего. У меня проблемы с удалением строк с крайними случаями (удаляются пустые секции и все видимые ячейки).

Это заставило меня думать, что, возможно, моя методология ошибочна. Кто-нибудь реализовал это в приложении? Как ты решил это? Работают ли ваши анимации строк?

1 Ответ

0 голосов
/ 16 июня 2009

Не усугубить ситуацию, но вы пробовали NSPredicate на реальном устройстве?

Я обнаружил, что NSPredicate работал на симуляторе, но, как и NSXMLDocument, не был доступен на самом устройстве (2.2.1).


обновление: учитывая, что NSPredicate доступен, все, что я могу добавить, - это то, что у меня были непредсказуемые результаты с deleteRowsAtIndexPaths: также с withRowAnimation - мне пришлось согласиться на вызов reloadData и наличие неанимированного перехода.

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

В вашем случае, когда видимые изменения потенциально неочевидны, я подозреваю, что с точки зрения удобства использования может быть достаточно просто использовать анимированный UIImageView, перемещающийся с севера на юг через область UITableView. (вызов сам по себе, к сожалению).

Это даст дополнительный бонус подтверждения применения фильтра для пользователя, даже если видимых изменений не произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...