Когда пользователь нажимает кнопку в ячейке 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 после этого будут любые соответствующие клетки, чтобы увидеть что связанный с ним объект был либо понравился, либо не понравился, и соответствующим образом скорректировать его изображение. Я не уверен, связано ли это странное поведение с состоянием гонки, потому что это не объясняет, почему всегда каждая третья ячейка имеет один и тот же образ.
Так как ваши ячейки повторно используются, и есть ли условие, что вы возвращаете одну и ту же клетку dequed? – Gihan
@Gihan Я так не думаю, потому что ячейки каждый загружают остальные атрибуты правильно. Например, каждый показывает правильное количество понравившихся, правильную фотографию и так далее. Обратите внимание, что я пропустил подробности загрузки изображений/симпатий, а что нет, но они будут в одной и той же функции :) – patrickd
, если вы выбрали userLiked, это может быть ваша ячейка dequed, но у нее есть upBut, downbut. Попробуйте установить их на нуль, если arrOfPics [indexPath.row] .userLiked! = Nil – Gihan