Swift:使 UIGestureRecognizer 只影响一个 UICollectionViewCell 而不是全部

Posted

技术标签:

【中文标题】Swift:使 UIGestureRecognizer 只影响一个 UICollectionViewCell 而不是全部【英文标题】:Swift: Make UIGestureRecognizer affect only one UICollectionViewCell instead of all 【发布时间】:2016-06-05 21:58:29 【问题描述】:

我有一个 UICollectionView,其中包含从我的 AssignmentManager 类填充的单元格。当用户想要删除分配时,他们按住一个单元格,以便删除按钮出现在他们单击的单元格上。使用下面的代码,当用户单击一个单元格时,删除按钮会出现在每个单元格上。如何使用 UIGestureRecognizer 解决此问题?我该怎么做才能指定用户在我的代码中按住并按住的单个单元格?任何帮助将不胜感激。

*需要注意的事项:我只包含了我认为与问题相关的以下代码。如果需要,我可以添加更多。也是的,我确实将 deleteButton 拼错为 delteButton。如果这让任何人感到困惑,我很抱歉。

    var userWantsToRemoveDeleteButton: Bool = false
    var userDelete: Bool = false

        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
               let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! homeworkcell
               cell.delteButton.hidden = true
               cell.delteButton.enabled = false
                    if userDelete == true 
                        cell.delteButton.hidden = false
                        cell.delteButton.enabled = true
                        if userWantsToRemoveDeleteButton == true 
                            cell.delteButton.hidden = true
                            cell.delteButton.enabled = false
                        
                    
                    // add button gestures
                    cell.delteButton?.layer.setValue(indexPath.item, forKey: "index")
                    cell.delteButton?.addTarget(self, action: "deleteAssignment:", forControlEvents: UIControlEvents.TouchUpInside)

                    // add the swipe gestures
                    let longPress = UILongPressGestureRecognizer(target: self, action: "deleteMode:")
                    cell.addGestureRecognizer(longPress)

                    let assignments = AssignmentManager.assignments[indexPath.item]
                    cell.myLabel.text = assignments.title
                    cell.assignment = assignments
                    cell.dueLabel.text = dateString
                    cell.myLabel.textColor = UIColor.whiteColor()
                    cell.backgroundColor = UIColor.blueColor()
                    cell.layer.borderColor = UIColor.blackColor().CGColor
                    cell.layer.borderWidth = 1
                    cell.layer.cornerRadius = 8

                    return cell
            

    func deleteMode(sender: UISwipeGestureRecognizer) 
            userDelete = true
            userWantsToRemoveDeleteButton = false
            collectionView.reloadData()

            doneEditingButton.enabled = true
    

    func deleteAssignment(sender: UIButton) 
        let i : Int = (sender.layer.valueForKey("index")) as! Int
        AssignmentManager.deleteAssignment(i)

        NSUserDefaultsManager.synchronize()

        collectionView.reloadData()
    

【问题讨论】:

【参考方案1】:

嗯,这是因为 userDelete 变为真,然后按钮显示在每个单元格中。您应该记住用户按下了哪个单元格。所以可能会在单元格中添加标签(indexPath.row),然后在 deleteMode 函数中调用 reload 方法。然后在 cellForRow 方法中检查selectedTag 是否等于 indexPath.row,如果是则显示按钮,否则隐藏它。 这只是一个简单的示例,您可以如何做到这一点....

【讨论】:

那么我会在 deleteMode 函数或 cellForRow 方法中向单元格添加标签吗?

以上是关于Swift:使 UIGestureRecognizer 只影响一个 UICollectionViewCell 而不是全部的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何使这个结构符合 Codable?

你如何使情节提要上的 UIImageView 可点击(swift)

如何使屏幕仅垂直。 (UITabBarController/Swift)

@objc 协议使 swift 编译器崩溃

swift 使 UIImageView 和 UIView 像一层一样使它们一起动画

使 UiTextField 只接受粘贴选项 - Swift