细胞重用初学者?点击一个单元格中的按钮会影响另一个单元格

Posted

技术标签:

【中文标题】细胞重用初学者?点击一个单元格中的按钮会影响另一个单元格【英文标题】:Cell reuse beginner? Tapping button in one cell affects another 【发布时间】:2015-06-25 13:21:55 【问题描述】:

我有一个带有自定义单元格的 TableViewController。当我在其中一个单元格内点击类似按钮时,会导致至少另一个单元格点击类似按钮。

我正在使用 Parse,它不会影响第二个被幽灵点击的实际点赞数,但它会禁用点赞按钮并将其变为红色。

我已阅读有关单元重用和类似主题的信息,但完全迷失了方向。我是 swift 新手,如果有人可以帮助我解决这个问题,我在 SO 上找不到关于 Swift 和 Parse 的解决方案。

TableViewController

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var cell:ChinTwoTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ChinTwoTableViewCell

    cell.selectionStyle = .None

    // Configure the cell...

    let chinTwo:PFObject = self.timelineData.objectAtIndex(indexPath.row) as! PFObject

    var myVar:Int = chinTwo.objectForKey("likeCount") as! Int
    cell.countLabel.text = String(myVar)

    cell.nameLabel.text = chinTwo.objectForKey("name") as? String
    cell.bodyText.text = chinTwo.objectForKey("body") as! String

    cell.bodyText.font = UIFont(name: "HelveticaNeue-UltraLight", size: 18)
    cell.bodyText.textAlignment = .Center

    cell.likeButton.tag = indexPath.row;
    cell.likeButton.addTarget(self, action: "likeButtonTapped:", forControlEvents: .TouchUpInside)

    return cell


 @IBAction func likeButtonTapped(sender: AnyObject) 

    let chinTwo = self.timelineData[sender.tag] as! PFObject

    chinTwo["likeCount"] = (chinTwo["likeCount"] as! Int) + 1

    sender.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)

    chinTwo.saveInBackgroundWithBlock 
        (success: Bool, error: NSError?) -> Void in
        if (success) 
            println("Worked")
         else 
            println("Didn't Work")
        
    

    self.tableView.reloadData()


TableViewCell

@IBAction func likeTapped(sender: AnyObject)  
    likeButton.enabled = false

报告按钮也会出现同样的问题。

【问题讨论】:

两件事:(1)请发布您的 cellForRowAtIndexPath 代码(您的 IBAction 中似乎有真正属于那里的代码)。 (2) 这不是您的问题,但是...您不希望每次都重新加载数据,除非对一个单元格的操作确实会影响整个数据集。随着您的 tableView 数据集的增长,这将导致一个可笑的负担。查看 reloadRowsAtIndexPaths。 这不是您的问题的确切答案,但我在这里回答的问题可能会开始为您指明正确的方向:***.com/questions/31016503/… @BradBrighton 我发布了 cellForRowAtIndexPatch,所以我应该删除该行以进行 reloadData 吗?我这样做的唯一原因是因为当我按下点赞按钮时,点赞计数器在 Parse 上会上升,但在 tableview 上却没有。有什么方法可以双向更新而不需要重新加载整个数据集? 我会看看新代码......另外,我特别提到了一个调用来查看重新加载:reloadRowsAtIndexPaths()。 我尝试添加以下内容,但似乎没有奏效。 var selectedRowIndex = self.tableView.indexPathForSelectedRow() if let indexPath = selectedRowIndex self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) 【参考方案1】:

由于单元格可重复使用,相同的likeButton 将用于多个单元格,具体取决于它是否显示。如果您更改一个实例的颜色,当它再次用于另一个单元格时,它将保持该颜色。而不是在 click 方法中设置颜色,您应该在 cellForRowAtIndexPath 方法中确定按钮是否应该为红色。所以像:

var likedRows: Set<Int> = Set()

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    ...
    self.markButtonIfLiked(cell.button, atRow: indexPath.row)
    ...


@IBAction func likeButtonTapped(button: UIButton) 
    ...
    self.likedRows.insert(button.tag)
    self.markButtonIfLiked(button, atRow: button.tag)
    ...


func markButtonIfLiked(button: UIButton, atRow row: Int) 
    if (self.likedRows.contains(row)) 
        button.setTitleColor(.redColor(), forState: .Normal)
    

而且你不应该需要tableView.reloadData() 电话。

【讨论】:

hasBeenClicked 函数中有什么? chinTwo 是一个 PFObjetct,它不是一个成员函数 也许您可以将已点击的按钮保存在私人列表中:self.clickedButtons.append(sender.tag) 然后contains(self.clickedButtons, sender.tag)。也许不是最漂亮的? 好的,我已经尝试过了,但似乎无法让它工作。当我单击一个like 按钮时,它会将该单元格添加到一个名为likedPosts 的数组中,但我不知道如何以及在哪里检查它,就重新加载数据/启用和禁用按钮/红色而言?我试过for likes in likedPosts if(cell.likeButton.tag == likes) println("It worked") ,但没用。 添加到cellForRowAtIndexPath:if (contains(self.clickedButtons, sender.tag)) cell.likeButton.setTitleColor(.redColor(), forState: .Normal) 它在说“使用未解析的标识符‘发件人’”

以上是关于细胞重用初学者?点击一个单元格中的按钮会影响另一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

当点击另一个按钮时,取消选择表格视图单元格中的按钮

单元格中的选定按钮显示在重用单元格上 - 也使用 sender.tag 进行按钮区分

重用 tableview 单元格中的元素

如何显示一系列单元格中的活动目录的结果

单击单元格本身而不是按钮时,(静态)单元格中的按钮会消失

仅更改一个 collectionview 单元格的对象