首次加载后如何在 UICollectionView 中选择一些项目?

Posted

技术标签:

【中文标题】首次加载后如何在 UICollectionView 中选择一些项目?【英文标题】:How to select some items in the UICollectionView after it first load? 【发布时间】:2013-03-05 16:03:15 【问题描述】:

我试着写

[self collectionView:myCollectionView didSelectItemAtIndexPath:selectedIndexPath]

并且viewDidLoad中UICollectionViewCell的selected=YES,确实实现了didSelectItemAtIndexPath方法,但是cell没有被选中。

我在 UICollectionViewCell 子类的(void)setSelected:(BOOL)selected 中编写了选中状态。加载视图后,手动选择功能起作用。但我不能让它在视图第一次加载后自动选择一些项目。

我尝试在以下位置编写代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath,都不行。

我发现它首先运行viewDidLoaddidSelectItemAtIndexPath,然后是cellForItemAtIndexPath,似乎我无法在cellForItemAtIndexPath之前获得indexPath(我知道)中的单元格,因为在那之前单元格不存在。那么如何在UICollectionView首次加载后选择其中的一些项目呢?

对不起,我的英语很差。提前致谢。

【问题讨论】:

【参考方案1】:

不确定,如果您的问题正确,但这里有一个可能的解决方案:

在例如viewWillAppear:

[self.collectionView reloadData];
NSIndexPath *selection = [NSIndexPath indexPathForItem:THE_ITEM_TO_SELECT 
                                             inSection:THE_SECTION];
[self.collectionView selectItemAtIndexPath:selection 
                                  animated:YES 
                            scrollPosition:UICollectionViewScrollPositionNone];

请记住,以编程方式调用“selectItemAtIndexPath”不会调用相关的委托方法;如果需要,您必须在代码中调用它们。

【讨论】:

谢谢!我已经解决了!我总是使用错误的代码:[self collectionView:_tagsCollectionView didSelectItemAtIndexPath:selectedIndexPath] 并试图把它放在任何地方,而不是selectItemAtIndexPath,所以总是不起作用。 当我的视图被加载时,这个方法对我很有用。但在我看来,我有自动选择的拇指 您的问题到底是什么?最初的问题是关于视图的第一次加载。 只要我做得“够晚”,这对我来说效果很好。例如,它在 viewDidLoad 中有效,但在 collectionView:cellForItemAtIndexPath:、viewDidAppear 或 viewWillAppear 中无效。 Follow On:即使在 viewDidLoad 中,我也只会看到 1 个单元格的选择工作。通过将选择移动到 viewDidLayoutSubviews,我能够选择多个单元格。【参考方案2】:

在我的情况下,selectItemAtIndexPathreloadData 之后没有任何效果,所以我不得不在performBatchUpdates 的完成块中调用它:

collectionView.dataSource = ...
collectionView.delegate = ...

let indexPath = ...

collectionView.performBatchUpdates(nil)  _ in
  collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: .None)

【讨论】:

谢谢。我在 reloadData 后进行 selectItem 操作的情况相同。你的回答解决了我的问题。【参考方案3】:

斯威夫特 3

实现这个覆盖函数,你的collectionview是在哪里创建的。 假设我们有 1 个部分 1 行,例如 Instagram 故事。

 override func viewDidAppear(_ animated: Bool) 
        // Auto Select First Item
        self.myCollectionView.performBatchUpdates(nil)  _ in
            self.myCollectionView.selectItem(at: IndexPath(item: 0, section: 0), animated: false, scrollPosition: [.centeredHorizontally])
            self.collectionView(self.myCollectionView, didSelectItemAt : IndexPath(item: 0, section: 0))
        
    

【讨论】:

以上是关于首次加载后如何在 UICollectionView 中选择一些项目?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 完成加载后如何启动功能?

加载后如何将 UICollectionView 单元格居中?

完成加载后,在 UICollectionView 中的第一个单元格上调用函数

页面加载时滚动后如何访问 UICollectionView 中的特定单元格?

首次加载时自动选择的项目

首次加载android后如何禁用谷歌地图当前位置跟踪