加载到表格视图单元格中的冗余图像 swift

Redundant image loaded into tableview cell swift

当用户按下我的 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 数据会导致任何相关单元格看到与其关联的对象被喜欢或不喜欢,并相应地调整其图片。我不确定这种奇怪的行为是否是由于竞争条件引起的,因为这并不能解释为什么总是每三个单元格都有相同的图像。

如果您的 userLiked 为 nil,则可能是您的 dequed 单元格仍然设置了 upBut、downBut 图像。尝试在 else of if arrOfPics[indexPath.row].userLiked != nil

中将它们设置为 nil