细胞重用初学者?点击一个单元格中的按钮会影响另一个单元格
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)
它在说“使用未解析的标识符‘发件人’”以上是关于细胞重用初学者?点击一个单元格中的按钮会影响另一个单元格的主要内容,如果未能解决你的问题,请参考以下文章