5

我试图在 UICollectionView 中记住一个项目(indexPath.item)的索引,然后在视图被替换然后恢复后,滚动到该记住的项目。

记忆item时,indexPath和indexPath.item分别是:

indexPath is: <NSIndexPath 0x1d87b380> 2 indexes [0, 32]
indexPath.item is: 32

稍后为该项目重新计算 indexPath 时,indexPath 和 indexPath.item 为:

indexPath is: <NSIndexPath 0x1d8877b0> 2 indexes [0, 32]
item is: 32

我尝试使用以下方法滚动到记忆的位置:

NSIndexPath *iPath = [NSIndexPath indexPathForItem:i inSection:0];
[self collectionView scrollToItemAtIndexPath:iPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];

我收到一个错误:

attempt to scroll to invalid index path
4

2 回答 2

12

[self.collectionView reloadData]; 在尝试滚动到 indexPath 之前打电话吗?

如果要在 reloadData 完成时重新定位 indexPath,请将代码放在这样的块中:

[UIView animateWithDuration:0
        animations: ^{ [self.collectionView reloadData]; }
        completion:^(BOOL finished) {
                      NSIndexPath *iPath = [NSIndexPath indexPathForItem:i inSection:0];
                      [self collectionView scrollToItemAtIndexPath:iPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
 }];

在调用之前scrollToItemAtIndexPath,您还可以检查 section 中的项目数以确保i有效,否则您仍然会遇到相同的错误。

于 2015-03-06T02:51:10.027 回答
2

打印 numberofItemsInSection 显示它用于滚动的视图已过时。当我在刷新视图后使用 scrollToItemAtIndexPath 时,它起作用了!

于 2015-05-03T14:35:04.767 回答