uicollectionview在reloaddata之后立即选择一个项目?

时间:2013-01-08 10:19:12

标签: ios uicollectionview

调用-[UICollectionView reloadData]后,显示单元格需要一些时间,因此在调用reloadData后立即选择项目不起作用。有没有办法在reloadData之后立即选择一个项目?

9 个答案:

答案 0 :(得分:7)

沿着this answer的路线,我发现在layoutIfNeeded之后调用reloadData似乎在我对collectionView执行其他操作之前有效地“刷新”重新加载:

[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
...

在页面上我找到了这个解决方案,一些评论者表示它在iOS 9上没有对他们有效,但对我来说没问题,所以你的里程可能会有所不同。

答案 1 :(得分:4)

我正在处理collectionView: cellForItemAtIndexPath:中的单元格选择。我发现的问题是,如果单元格不存在,只需调用selectItemAtIndexPath: animated: scrollPosition:就不会实际选择该项目。

相反,你必须这样做:

cell.selected = YES;
[m_collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];

答案 2 :(得分:3)

不要使用reloadData

请改用- (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion。在完成单元插入/删除等的动画之后执行完成块。您可以在(void (^)(void))updates

中调用reloadData

答案 3 :(得分:3)

Apple说:

  

您不应该在动画块中间调用此方法   插入或删除项目的位置。插入和删除   自动使表格的数据得到适当更新。

实际上,你不应该在任何动画的中间调用这个方法(包括滚动中的UICollectionView)。

所以,你可以使用:

[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

或标记不是任何动画,然后调用reloadData; 或

[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];

希望这对你有所帮助。

答案 4 :(得分:2)

Swift方式:

let selected = collectionView.indexPathsForSelectedItems()
collectionView.performBatchUpdates({ [weak self] in
    self?.collectionView.reloadSections(NSIndexSet(index: 0))
    }) { completed -> Void in
        selected?.forEach { [weak self] indexPath in
            self?.collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: [])
        }
}

答案 5 :(得分:0)

确保在主线程上调用reloadData。这可能是导致细胞更新延迟的原因。

答案 6 :(得分:0)

我在willDisplayCell colelctionView委托上处理了它。想法:需要一个临时变量来指定已经执行或不执行的初始滚动(scrollIsRequired)。当显示最后一个可见单元格时,我们可以滚动到所需的单元格并设置此变量以避免再次滚动。

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{

    //Perform any configuration

    if (CGRectGetMaxX(collectionView.frame) <= CGRectGetMaxX(cell.frame)) {
        // Last visible cell
        if (self.scrollIsRequired) {
            [self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:self.initiallySelectedRepresentativeVerse inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionLeft];
            self.scrollIsRequired = NO;
        }
    }
}

它对我来说就像一个魅力。

答案 7 :(得分:0)

这对我有用:

我保留了所选索引路径的引用并覆盖了reloadData函数:

override func reloadData() {
    super.reloadData()
    self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}

我尝试使用indexPathForSelectedItems,但它在集合视图加载时创建了一个无限循环。

答案 8 :(得分:-3)

创建一个方法,在调用reload eg;

之后执行选择并使用performSelector调用它
[self performSelector:@selector(selectIt) withObject:self afterDelay:0.1];