当用户按下我的tableview单元格中的按钮时,我想将按钮的图像更改为另一个图像。我这样做的方式如下:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("itemCell", forIndexPath: indexPath) as! itemCell
cell.upBut.tag = indexPath.row
cell.upBut.addTarget(self, action: "voteUp:", forControlEvents: UIControlEvents.TouchUpInside)
if arrOfPics[indexPath.row].userLiked != nil
{
if arrOfPics[indexPath.row].userLiked == 1
{
cell.upBut.setImage(UIImage(named: "green_check.png"), forState: UIControlState.Normal)
cell.downBut.setImage(UIImage(named: "cross.png"), forState: UIControlState.Normal)
}
if arrOfPics[indexPath.row].userLiked == -1
{
cell.upBut.setImage(UIImage(named: "checkmark.png"), forState: UIControlState.Normal)
cell.downBut.setImage(UIImage(named: "red_cross.png"), forState: UIControlState.Normal)
}
}
return cell
}
此方法成功实现了我想要的正确单元格中按钮图像的更改。但是,它有一个奇怪的副作用:每个第三个单元格也有相同的图像变化。如果单元格1中的按钮图像被更改,那么它也将在单元格4,7,10等中更改。
我发现我的数据表示不是这个的原因,IE arrayOfPics [3] .userLiked是零,但第4个单元格有更新的图像。
此外,知道userLiked默认为nil可能很重要。仅当用户按下我们试图更改其图像的按钮时才会设置它,如以下方法所示:
func voteUp(sender:UIButton) { // up 1 --> true, -1 --> false
NSOperationQueue.mainQueue().addOperationWithBlock {
if arrOfPics[sender.tag].userLiked != nil && arrOfPics[sender.tag].userLiked == 1 {//let 1 mean user voted up
return
}
dispatch_async(dispatch_get_main_queue()){
arrOfPics[sender.tag].userLiked = 1
}
let request = NSMutableURLRequest(URL: NSURL(string: "http://www.url")!)
let row = sender.tag
request.HTTPMethod = "POST"
let postString = "blahblah"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {
data, response, error in
if error != nil {
print(error)
return
}
dispatch_async(dispatch_get_main_queue()){
arrOfPics[row].likes!++
self.tableView.reloadData()
}
})
task.resume()
}
}
我认为在这样做之后重新加载tableview数据会导致任何相关的单元格看到与之关联的对象已被喜欢或不喜欢,并相应地调整其图片。我不确定这种奇怪的行为是否是由于竞争条件造成的,因为这并不能解释为什么每个第三个细胞都有相同的图像。
答案 0 :(得分:1)
如果你的userLiked为nil可能是你的dequed cell仍然有upBut,downBut图像设置。如果arrOfPics[indexPath.row].userLiked != nil