2015-12-18 2 views
0

Когда пользователь нажимает кнопку в ячейке tableview, я хочу изменить изображение кнопки на другое изображение. Я делаю это следующим образом:Резервное изображение, загруженное в ячейку tableview swift

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 по умолчанию равен нулю. Он устанавливается только тогда, когда пользователь нажимает на кнопку, изображение которой мы пытаемся изменить, как показано в следующем методе:

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

Так как ваши ячейки повторно используются, и есть ли условие, что вы возвращаете одну и ту же клетку dequed? – Gihan

+0

@Gihan Я так не думаю, потому что ячейки каждый загружают остальные атрибуты правильно. Например, каждый показывает правильное количество понравившихся, правильную фотографию и так далее. Обратите внимание, что я пропустил подробности загрузки изображений/симпатий, а что нет, но они будут в одной и той же функции :) – patrickd

+0

, если вы выбрали userLiked, это может быть ваша ячейка dequed, но у нее есть upBut, downbut. Попробуйте установить их на нуль, если arrOfPics [indexPath.row] .userLiked! = Nil – Gihan

ответ

1

, если ваш userLiked - это нуль, может быть ваша ячейка dequed по-прежнему имеет свои настройки upBut, downBut. Попробуйте установить их на нуль иначе, если arrOfPics[indexPath.row].userLiked != nil

+0

Или, может быть, лучше, если вы поместите код в метод 'readyForReuse' ячейки! –

Смежные вопросы