点击两次以突出显示收藏视图中的复选标记
Posted
技术标签:
【中文标题】点击两次以突出显示收藏视图中的复选标记【英文标题】:Tap twice to highlight checkmark in collection view 【发布时间】:2017-03-25 23:41:19 【问题描述】:我有一个收藏视图,您可以在其中点击单元格以放大图像并点击放大的图像以将其关闭,在每个单元格上我还有一个可选择的复选标记,因此您可以选择稍后下载选定的图像。除了有时我必须选择或取消选择复选标记两次之外,该代码几乎可以正常工作。我真的不明白我缺少什么,但这是我的代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell
let tap = UITapGestureRecognizer(target: self, action: #selector(checkmarkWasTapped(_ :)))
cell.backgroundColor = .clear
cell.imageView.image = UIImage(contentsOfFile: imagesURLArray[indexPath.row].path)
cell.checkmarkView.checkMarkStyle = .GrayedOut
cell.checkmarkView.tag = indexPath.row
cell.checkmarkView.addGestureRecognizer(tap)
return cell
func checkmarkWasTapped(_ sender: UIGestureRecognizer)
let checkmarkView = sender.view as! SSCheckMark
let indexPath = IndexPath(row: checkmarkView.tag, section: 0)
let imageURL = imagesURLArray[indexPath.row]
if checkmarkView.checked == true
checkmarkView.checked = false
selectedImagesArray.remove(at: selectedImagesArray.index(of: imageURL)!)
else
checkmarkView.checked = true
selectedImagesArray.append(imageURL)
collectionView.reloadItems(at: [indexPath])
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
addZoomedImage(indexPath.row)
addGestureToImage()
addBackGroundView()
view.addSubview(selectedImage)
任何帮助都会很棒。谢谢
【问题讨论】:
【参考方案1】:我相信您在滚动集合视图时遇到问题,集合视图会重新加载每个单元格,并且您没有任何有关 checkview 最新状态的信息。
通常我存储一个 bool 数组(集合视图中元素数量的大小,您可以在加载模型后轻松创建)所以每次用户双击复选标记视图时,我都会更改集合视图单元格的索引并更改 bool数组元素为真。
var boolArray = [Bool]()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell
let tap = UITapGestureRecognizer(target: self, action: #selector(checkmarkWasTapped(_ :)))
cell.backgroundColor = .clear
cell.imageView.image = UIImage(contentsOfFile: imagesURLArray[indexPath.row].path)
if(boolArray[indexPath.row])
cell.checkmarkView.checked = false
else
cell.checkmarkView.checked = true
cell.checkmarkView.checkMarkStyle = .GrayedOut
cell.checkmarkView.tag = indexPath.row
cell.checkmarkView.addGestureRecognizer(tap)
return cell
这可能是一个丑陋的解决方案,但我相信它会奏效。
【讨论】:
您好,感谢您的回复,您添加的 if 语句是否不会在每次重新加载时交换选择?是不是应该说if !(boolArray[indexPath.row])
如果用户在 boolArray[indexPath.row] 之前没有为单元格添加书签,则 boolArray[indexPath.row] 将为 false,因此在加载单元格时将取消选中 checkmarkView。否则会被检查。如果你的 checkmarkView 是这样工作的?
如果我在 viewdidload 中用 false 填充 bool 数组并使用if !(boolArray[indexPath.row])
它们都未选中,但是当我选择检查然后立即取消选中,如果我这样做但使用 if (boolArray[indexPath.row])
那么它们都是被选中,当我选择它们时没有任何反应。
啊,我需要更新checkmarkWasTapped()
中的布尔数组并使用if !(boolArray[indexPath.row])
,现在它可以工作了。感谢您的帮助!以上是关于点击两次以突出显示收藏视图中的复选标记的主要内容,如果未能解决你的问题,请参考以下文章
表单中的 SwiftUI Picker 不显示来自 CoreData 的复选标记