Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios uicollectionview是否在重新加载数据后立即选择项目?_Ios_Uicollectionview - Fatal编程技术网

Ios uicollectionview是否在重新加载数据后立即选择项目?

Ios uicollectionview是否在重新加载数据后立即选择项目?,ios,uicollectionview,Ios,Uicollectionview,调用-[UICollectionView reloadData]后,单元格的显示需要一些时间,因此在调用reloadData后立即选择一个项目不起作用。是否有一种方法可以在重新加载数据后立即选择项目?创建一个进行选择的方法,并在调用重新加载后使用performSelector调用它,例如: [self performSelector:@selector(selectIt) withObject:self afterDelay:0.1]; 确保正在主线程上调用reloadData。这可能是您的单

调用
-[UICollectionView reloadData]
后,单元格的显示需要一些时间,因此在调用
reloadData
后立即选择一个项目不起作用。是否有一种方法可以在重新加载数据后立即选择项目?

创建一个进行选择的方法,并在调用重新加载后使用performSelector调用它,例如:

[self performSelector:@selector(selectIt) withObject:self afterDelay:0.1];

确保正在主线程上调用
reloadData
。这可能是您的单元格更新延迟的原因。

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

相反,你必须做:

cell.selected=YES
[m_collectionView selectItemAtIndexPath:indexPath动画:无滚动位置:UICollectionViewScrollPositionNone]

不要使用重新加载的数据

使用
-(void)执行更新:(void(^)(void))更新完成:(void(^)(BOOL finished))完成
。完成块在单元插入/删除等动画完成后执行。您可以将对重新加载数据的调用放入
(void(^)(void))更新

苹果说:

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

实际上,你不应该在任何动画中间调用这个方法(包括在滚动中<代码> uICLoopDebug视图>代码>)。 因此,您可以使用:

[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
或者标记确定没有任何动画,然后调用
reloadData
; 或


希望这对您有所帮助。

我在willDisplayCell ColelActionView委托中处理了它。想法:需要一个临时变量来指定初始滚动是否已经执行(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;
        }
    }
}
-(void)collectionView:(UICollectionView*)collectionView将显示单元格:(UICollectionViewCell*)用于ItemAtIndexPath的单元格:(NSIndexPath*)indexPath{
//执行任何配置
如果(CGRectGetMaxX(collectionView.frame)快速方式:

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: [])
        }
}
按照的思路,我发现在对collectionView执行其他操作之前,在
重新加载数据
之后调用
layoutifneedd
似乎可以有效地“刷新”重新加载:

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

在我找到此解决方案的页面上,一些评论员指出,它在iOS 9上对他们不起作用,但它对我来说很好,因此您的里程数可能会有所不同。

这就是对我起作用的原因:

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

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

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

我不喜欢此解决方案,因为它需要任意的时间。我们如何知道何时完成
重新加载数据
?似乎无法查询此操作。对此有任何更新吗?我遇到了相同的问题,正在尝试创建UICollectionView加载期间的一个选择。并展示了如何执行此操作。当UICollectionView有很多项时,我看到动画更新调用与重新加载数据之间存在巨大的性能问题。
override func reloadData() {
    super.reloadData()
    self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}