Как бороться с противоречивым поведением при изменении значения снимка animatedDifferences? - PullRequest
0 голосов
/ 27 апреля 2020

Я начну с объяснения того, как все должно работать:

У меня есть представление коллекции с композиционным макетом и источником данных, доступным для диффузии.

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

Теперь я попытался реализовать идею о том, что задачи выполняются для день go в нижней части обзора, так что наверху находятся только те, которые еще предстоит сделать. Для этого я настроил дескриптор сортировки для своего запроса на выборку.

До этого момента все работало, как и ожидалось, но я хотел, чтобы эта ячейка двигалась вниз анимированно, поэтому я изменил dataSource.apply(snapshot, animatingDifferences: false) на true

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

Вот мой метод setupSnapshot ():

func setupSnapshot() {
        snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
        snapshot.appendSections([.main])
        snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])
        dataSource.apply(snapshot, animatingDifferences: true)   
    }

Посмотрите: animatedDifferences: false (слева) ) и верно (справа)

animatedDifferences: false animatedDifferences: true

В качестве резюме, моя цель состоит в том, чтобы:

1) анимированные ячейки и 2) изменили внешний вид, когда установлено, как сделано. Кажется, что с animatedDifferences: false у меня может быть только цель 2 , а с animatedDifferences: true может быть только цель 1

Я пытался исследовать эту топи c уже и нашел кое-что о применении снимка дважды, один раз для разделов и один раз для элементов, но это не имело никакого значения.

Кто-нибудь может указать, что мне здесь не хватает?

1 Ответ

0 голосов
/ 27 апреля 2020

После дальнейшего изучения и в соответствии с комментариями отсюда:

Как получить отчетливый снимок из NSFetchResultsController в iOS 13?

есть разница в поведении в apply(snapshot: animatingDifferences:), когда его параметр animatingDifferences имеет другое значение.

Похоже, что с animatedDifferences: false, под капотом происходит reloadData (), чего не происходит с animatingDifferences: true, по крайней мере, согласно на эти комментарии и в соответствии с моим опытом.

Поэтому решение для моего кода настраивает setupSnapshot на:

func setupSnapshot(animated: Bool) {
      snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
      snapshot.appendSections([.main])
      snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])   
      dataSource.apply(snapshot, animatingDifferences: animated) {
         if animated {
            self.collectionView.reloadData()
         }
      }
}
...