如何限制 UICollectionView 中的可选单元格

Posted

技术标签:

【中文标题】如何限制 UICollectionView 中的可选单元格【英文标题】:How can I limit the selectable cells in a UICollectionView 【发布时间】:2018-10-05 05:41:34 【问题描述】:

在我的应用程序中,我有一个 UICollectionView,有 12 x 4 个正方形。我希望用户在同一周期中只能连续选择 4 个。我怎样才能阻止其他行?我在UITableView 中读到了一些关于标题的内容,但这在UICollectionView 中不起作用

【问题讨论】:

您可以在选择单元格之前使用collectionview的委托developer.apple.com/documentation/uikit/…检查您的条件 【参考方案1】:

实现下面提到的UICollectionViewDelegate

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

【讨论】:

这不是限制数量吗?例如,我希望只有 [0,1] - [0,4] 是可选的 / [0,5] - [0,8] 等等 你可以用你自己的逻辑更新collectionView.indexPathsForSelectedItems?.count &lt;= 4【参考方案2】:

定义以下变量:

var firstSelectedIndex: Int?
var nextEligibleCount: Int = 0

然后更新collectionView委托方法:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

    switch indexPath.row 
    case 0, 4, 8, 12:
        firstSelectedIndex = indexPath.row
        print("-----New row click has been started------")
        print(String(indexPath.row) + " is clicked")
        nextEligibleCount = 1
    default:
        checkClick(atIndex: indexPath.row)
    

checkClick()定义如下:

func checkClick(atIndex selectedIndex: Int) 
    if firstSelectedIndex != nil 
        if selectedIndex == firstSelectedIndex! + nextEligibleCount 
            print(String(selectedIndex) + " is clicked")
            nextEligibleCount = nextEligibleCount + 1
         else 
            print("Invalid click")
        
    

【讨论】:

【参考方案3】:

试试这个解决方案:

var firstIndex = -1
var lastIndex = -1
var arraySelectedIndexes = [Int]()
var setEligibleIndexesForSelection = Set<Int>()

let numerOfItems = 20

我已尝试考虑所有情况:

extension ViewController : UICollectionViewDelegate 
    func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool 
        switch (self.setEligibleIndexesForSelection.contains(indexPath.row), self.arraySelectedIndexes.count == 0) 
        case (false,false):
            return false
        default:
            return true
        
    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        self.arraySelectedIndexes.append(indexPath.row)
        self.arraySelectedIndexes.sort()

        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.lightGray

        self.firstIndex = self.arraySelectedIndexes[0]
        self.lastIndex = self.arraySelectedIndexes[self.arraySelectedIndexes.count - 1]

        self.updateEligibleIndexArray()
    

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) 
        let indexOfSelectedData = self.arraySelectedIndexes.firstIndex(of: indexPath.row)
    self.arraySelectedIndexes.remove(at: indexOfSelectedData!)

        if self.arraySelectedIndexes.count > 0 
            self.firstIndex = self.arraySelectedIndexes[0]
            self.lastIndex = self.arraySelectedIndexes[self.arraySelectedIndexes.count - 1]
            self.updateEligibleIndexArray()
        
        else 
            self.firstIndex = -1
            self.lastIndex = -1
            self.setEligibleIndexesForSelection.removeAll()
        

        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.white

    

    func updateEligibleIndexArray() 
        self.setEligibleIndexesForSelection.removeAll()

        for i in self.firstIndex..<self.firstIndex+4 
            if i < self.numerOfItems && !self.arraySelectedIndexes.contains(i) 
                self.setEligibleIndexesForSelection.insert(i)
            
        

        for i in self.lastIndex-3..<self.lastIndex 
            if i >= 0 && !self.arraySelectedIndexes.contains(i) 
                self.setEligibleIndexesForSelection.insert(i)
            
        
    

我可能错过了一些场景,所以请告诉我它是否有效。

【讨论】:

是的,这对我来说非常有用,非常感谢:D 我该怎么做,第一行是可选择的,是在顶部的那一行?

以上是关于如何限制 UICollectionView 中的可选单元格的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 上的可重用性问题

如何向 UICollectionView 标头中的标签添加约束?

如何使用 UICollectionView 创建此 UI,以便内容不受单元格边界的限制

iOS 相机应用程序中的可拖动 UIButtons

如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图

限制UIScrollView中的可滚动区域