首页 > 解决方案 > 仅使用 shouldSelectItemAt indexPath 函数选择特定单元格

问题描述

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

示例:一开始,indexPath.row44-47 是可选的。如果按下我想要的按钮,则indexPath.row40-43 是可选的,依此类推。

我想过用 indexPath 创建一个数组,如果按下按钮,数组中的数字会低 4 个数字。

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

我怎么能意识到这一点?

标签: swiftxcodeuicollectionviewindexpath

解决方案


让我们考虑这些项目形成一个字符串数组,并且您将选定的索引作为一个范围来跟踪。

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
}

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


推荐阅读