仅使用shouldSelectItemAt indexPath函数选择特定的单元格

时间:2018-10-24 11:38:13

标签: swift xcode uicollectionview indexpath

我希望一次只能选择四个特定的单元格。按下按钮时,我希望可选单元格低4 indexPath.row

示例:首先,可以选择indexPath.row 44-47。如果我想要按下按钮,则indexPath.row 40-43是可选的,依此类推。

我考虑过使用indexPath创建一个数组,如果按下按钮,则数组中的数字要低4个数字。

我不知道如何将其添加到shouldSelectItemAt indexPath函数中。

我怎么能意识到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用IndexSet

var allowedSelectionRow: IndexSet
allowedSelectionRow.insert(integersIn: 44...47) //Initial allowed selection rows

collectionView(_:shouldSelectItemAt:)

return allowedSelectionRow.contains(indexPath.row) //or indexPath.item

无论何时需要:

allowedSelectionRow.remove(integersIn: 44...47) //Remove indices from 44 to 47
allowedSelectionRow.insert(integersIn: 40...43) //Add indices from 40 to 43

数组的优势:像集合一样,值是唯一的(没有重复项)。仅包含整数,可以添加有用的“范围”(不是添加所有索引,而是一个范围)。

注释后,如果只允许连续4行,则可以使用该方法:

func updateAllowedSectionSet(lowerBound: Int) { 
    let newRange = lowerBound...(lowerBound+3)
    allowedSectionRow.removeAll() //Call remove(integersIn:) in case for instance that you want always the 1 row to be selectable for instance
    allowedSectionRow.insert(integersIn: newRange) 
}

对于第一个,您只需要执行以下操作: updateAllowedSectionSet(lowerBound: 44)代替allowedSelectionRow.insert(integersIn: 44...47)

答案 1 :(得分:1)

让我们考虑一下这些项构成了一个String数组,并且您正在跟踪选定的索引作为Range。

var selectedRange: Range<Int>? {
    didSet {
        collectionView.reloadData()
    }
}

var items: [String] = [] {
    didSet {
        // To make sure that the selected indices are reset everytime this array is modified,
        // so as to make sure that nothing else breaks
        if items.count >= 4 {
            // Select the last 4 items by default
            selectedRange = (items.count - 4)..<items.count
        } else if !items.isEmpty {
            selectedRange = 0..<items.count
        } else {
            selectedRange = nil
        }
    }
}

然后,当您按下按钮减小范围时,可以使用此逻辑来处理相同的问题:

func decrementRange() {
    if var startIndex = selectedRange?.startIndex,
        var endIndex = selectedRange?.endIndex {

        startIndex = max((startIndex - 4), 0)
        endIndex = min(max((startIndex + 4), (endIndex - 4)), items.count)

        selectedRange = startIndex..<endIndex
    }
}

然后,您可以使用以下命令确定是否在活动范围内进行选择:

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {

    if let selectedRange = selectedRange {
        return selectedRange.contains(indexPath.item)
    }
    return false
}

注意:我建议您在尝试生产代码之前验证一下是否涵盖所有极端情况。