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

时间:2015-06-25 13:21:56

标签: ios swift uitableview cocoa-touch parse-platform

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

我正在使用Parse,并且它不会影响第二个实际的类似数量,它被重点轻击,但它禁用了类似按钮并将其变为红色。

我已阅读有关细胞重用和类似主题的内容但完全丢失了。我是swift的新手,如果有人可以帮我解决这个问题,我找不到关于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 个答案:

答案 0 :(得分:1)

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

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()来电。