点击两次以突出显示收藏视图中的复选标记

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]),现在它可以工作了。感谢您的帮助!

以上是关于点击两次以突出显示收藏视图中的复选标记的主要内容,如果未能解决你的问题,请参考以下文章

在word中如何取消突出标记

表单中的 SwiftUI Picker 不显示来自 CoreData 的复选标记

如何使用传单和 jQuery Birdseye 在点击时突出显示标记

Google 表格 - 条件格式 - 多个复选框

显示复选标记附件视图移动表格内容

如何在收藏视图中显示复选标记(图像)