当前位置: 首页 > 知识库问答 >
问题:

在UICollectionView中获取所选单元格计数

杜弘伟
2023-03-14

如何从UICollectionView中获取所选单元格计数和所选单元格数组,我需要设置选择的限制。下面是我的代码,它不工作。请引导。谢谢

 func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    let indexPaths = collectionView.indexPathsForSelectedItems!
        print(indexPaths)
    if let selectedItems = collectionView.indexPathsForSelectedItems {
                if selectedItems.count >= 3 {
                    collectionView.deselectItem(at: indexPath as IndexPath, animated: true)
                    return false
                }
            }
    return true
}

上面的代码,当编写在didSelect方法中时,只返回选定的单元格索引,但这里只跳到最后一行

return true 

共有1个答案

周浩博
2023-03-14

您可以使用UICollectionViewDelegate中的ShouldSelectItemat委托方法来实现:

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    return collectionView.indexPathsForSelectedItems?.count ?? 0 <=  selectionLimit
}

演示其工作方式的示例演示:

class ViewController : UIViewController {
    private var myCollectionView:UICollectionView?
    private var selectionLimit = 4

    override func viewDidLoad() {
        super.viewDidLoad()

        let view = UIView()
        view.backgroundColor = .white

        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
        layout.itemSize = CGSize(width: UIScreen.main.bounds.width * 0.7, height: 60)

        myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        myCollectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")
        myCollectionView?.backgroundColor = UIColor.white

        myCollectionView?.allowsMultipleSelection = true
        myCollectionView?.dataSource = self
        myCollectionView?.delegate = self

        view.addSubview(myCollectionView ?? UICollectionView())

        self.view = view
    }
}
extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath)
        myCell.backgroundColor = UIColor.blue
        return myCell
    }
}
extension ViewController: UICollectionViewDelegate {

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("Did select a cell at \(indexPath.row)")
        let itemsLeftToSelect = selectionLimit - (collectionView.indexPathsForSelectedItems?.count ?? 0)
        print("Have \(itemsLeftToSelect) items to select")
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        print("Did deselect a cell at \(indexPath.row)")
        let itemsLeftToSelect = selectionLimit - (collectionView.indexPathsForSelectedItems?.count ?? 0)
        print("Have \(itemsLeftToSelect) items to select")
    }

    func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        return collectionView.indexPathsForSelectedItems?.count ?? 0 <  selectionLimit
    }
}

当您达到选择限制时,ShouldSelectItemat返回false,DidSelectItemat函数将不再被调用。另一方面,如果您单击已选择的单元格,则DidDeselectItemat将被调用,您也将被调用,并且您能够再次选择+1个单元格,因为所选项的数量将随着1而减少。另请参阅示例中的调试日志。

 类似资料:
  • 问题内容: 我已经做过一些研究,但是找不到关于如何水平放置UICollectionView中的单元格的代码示例。 而不是第一个单元格像这样的 X00 ,我希望它像这样的 0X0 。有什么办法可以做到这一点? 编辑: 可视化我想要的东西: 当CollectionView中只有一个元素时,我需要它看起来像版本B。当我获得多个元素时,它应该类似于版本A,但具有更多元素。 目前,当我只有1个元素时,它看起

  • 我目前正在使用作为用户交互界面网格,它运行良好。但是,我想启用水平滚动。网格每页支持8个项目,当项目总数为4个时,这是启用水平滚动方向时应该如何排列项目: 这里0 - 有没有办法让它们像这样居中对齐: 这样内容看起来更干净? 下面的安排也可能是我期待的一个解决方案。

  • 当滚动垂直收集单元格并在其中显示水平收集视图时,我有一个性能问题。原因是单元的数据重用-在每个父单元重用周期重新加载水平收集视图。有人知道我怎样才能避免这么多的重装吗?

  • 我需要显示一组具有不同高度的collectionViewCells。视图太复杂,我不想手动计算预期的高度。我想强制自动布局来计算单元格高度 在之外调用会破坏ColltionView并导致其崩溃 另一个问题是单元格不在单独的xib中,所以我无法手动实例化临时单元格并将其用于高度计算。 对此有什么解决办法吗? 编辑: 一旦被调用,就会发生崩溃。如果我不调用该方法并返回大小,则一切正常,单元格显示为没有

  • 本文向大家介绍JS获取单击按钮单元格所在行的信息,包括了JS获取单击按钮单元格所在行的信息的使用技巧和注意事项,需要的朋友参考一下 用JS获取表格中单击某个单元格中按钮,得到所在行的信息:

  • 我有带水平滚动的UICollectionView,整个屏幕上总是有两个单元格并排显示。我需要滚动到单元格开始处。启用分页后,集合视图将滚动整个页面,即一次滚动2个单元格,然后停止。 我需要启用按单个单元格滚动,或按多个单元格滚动,并在单元格边缘停止。 我尝试子类化并实现方法子类的所有方法?谢谢