删除一个新中心UICollectionViewCell后如何获取indexPath?

时间:2018-12-06 22:00:43

标签: ios swift uicollectionview

我有一个水平的collectionView,称为postsCollectionView,每个视图都与屏幕一样宽。目前,我正在使用以下方法计算currentPost的indexPath:

let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)

当帖子被删除并且我已重置“ currentPost”时,我的View Controller中有这个骇人听闻的方法:

 func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        if (postsFetchedResultsController.fetchedObjects?.count)! > 0 {
            print(postsCollectionView.indexPathsForVisibleItems,postsCollectionView.contentOffset.x) //prints [],375.0
            //HACK
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // change 2 to desired number of seconds
                let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
                let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)
                self.currentPost = self.postsFetchedResultsController.object(at: currentPostIndexPath)
            }
        } else {
            print("no items left")
        }
    }

基本上,有一个NSFetchedResultsController,它在数据源更改时调用collectionView的deleteItem方法。我正在使用回调didEndDisplaying单元,以尝试-完全删除该单元后,将self.currentPost设置为现在显示的已取代位置的帖子。

问题是我认为在删除单元格时会调用此回调,但是动画尚未完成,因此其偏移量仍为375(屏幕的宽度),因此即使当前索引路径为1,它应该为0,因为现在collectionView中只有1个帖子。

还有没有办法等到动画完成?还是有一种更好的方法来删除一个位于中心的集合视图单元格的新indexPath?

1 个答案:

答案 0 :(得分:1)

1)为什么不将currentPost设置为nil并在实际需要时重新计算它,而不是在删除单元格后立即计算

2)您可以使用UICollectionView.indexPathForItem(指向CGPoint)获取IndexPath。这可能更安全。我想您传递的要点是

class TodoEffects {
  @Effect() updateTodo = this.s.optimisticUpdate('UPDATE_TODO', {
    run: (a: UpdateTodo, state: TodosState) => {
      return this.backend(state.user, a.payload)
      .pipe(
        map(resp => ({
          type: 'UPDATE_TODO_SUCCESS',
          payload: resp
        }))
      );
    }

y位置取决于您如何将单元格放置在集合视图中。

如果立即需要结果。您知道删除前的当前索引。如果要删除的单元格的索引小于或等于该索引,则增加当前索引,如果删除的单元格的索引较大,请不要更改它。