swift - 仅使用 shouldSelectItemAt indexPath 函数选择特定单元格
问题描述
我希望一次只能选择四个特定的单元格。当按下按钮时,我希望可选择的单元格低 4 个indexPath.row
。
示例:一开始,indexPath.row
44-47 是可选的。如果按下我想要的按钮,则indexPath.row
40-43 是可选的,依此类推。
我想过用 indexPath 创建一个数组,如果按下按钮,数组中的数字会低 4 个数字。
比我不知道,如何将它添加到shouldSelectItemAt indexPath
函数中。
我怎么能意识到这一点?
解决方案
让我们考虑这些项目形成一个字符串数组,并且您将选定的索引作为一个范围来跟踪。
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
}
注意:我建议您在尝试生产代码之前验证这是否涵盖所有极端情况。
推荐阅读
- flutter - Tailwindcss 颜色托盘在颤动中的模拟器上不显示相同的颜色
- azure-devops - 使用 Power Shell 脚本下载 DacPac
- python - SQLAlchemy ORM 多个多对多关系
- github - 在 vscode 中打开项目时,git 扩展从我的笔记本电脑中抓取文件
- html - 移动浏览器 - 网站中的哪个元元素是这个图标
- arrays - Spark:GroupBy和collect_list同时按另一列过滤
- python - 为什么 grpc.FutureTimeoutError 不是 grpc.RpcError 和 grpc.Call 的实例?
- ruby-on-rails - Sidekiq Worker 缓存未过期
- python - 如何确定一维数组中的相邻元素?
- vim - 插入模式下Command + V粘贴后如何让VIM进入正常模式?