Ошибка выбора ячейки табличного представления

У меня есть вид таблицы, где пользователь выбирает друзей. Моя проблема в том, что по какой-то причине, когда выбирается одна ячейка, выбирается и другая не связанная ячейка. Может ли кто-нибудь помочь мне понять, что происходит?

Вот мой код для обработки выбора:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
     let indexPath = tableView.indexPathForSelectedRow
     let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! SpotFriendsCell
     let Friend = currentCell.AddFriendLabel.text
     if self.invitedFriends.containsObject(Friend!) {
         invitedFriends.removeObject(Friend!)
         currentCell.Invited.image = UIImage(named: "unckecked.png")
         tableView.reloadData()
     } else {
         invitedFriends.addObject(Friend!)
         NSUserDefaults.standardUserDefaults().setObject("Yes", forKey: "selectedFriends")
         currentCell.Invited.image = UIImage(named: "checked.png")
         tableView.reloadData()
     }
}

у меня есть UIImageView справа от клетки, которую я использую, чтобы отслеживать, какие друзья выбраны, а какие нет. Если изображение ячейки "unchecked.png", добавляется друг, а изображение заменяется на "checked.png". и наоборот.

2 ответа

Решение

Эта строка не нужна, так как у вас уже есть indexPath в параметре.

let indexPath = tableView.indexPathForSelectedRow

Тогда вместо того, чтобы играть с клетками напрямую, вы должны играть с объектами. Я предполагаю, что у вас уже есть список, содержащий Friend где-то, вы должны получить Friend Ссылка от туда выбранного индекса.

let selectedFriend = self.allFriends[indexPath.row]

Тогда вы можете сохранить свою логику простой.

if self.invitedFriends.containsObject(selectedFriend) {
     invitedFriends.removeObject(selectedFriend)
     } else {
         invitedFriends.addObject(selectedFriend)
         NSUserDefaults.standardUserDefaults().setObject("Yes", forKey: "selectedFriends")
     }

    tableView.reloadData()
}

Ваша логика изображения должна тогда просто войти в вас cellForRowAtIndexPath метод.

Когда ты reloadDataВаши клетки регенерируются из клетки-прототипа для повторного использования. Если вы не добавите функциональность для установки этого изображения в соответствии с вашим источником данных в cellForRowAtIndexPath, изображение всегда будет по умолчанию равным тому, которое находится в вашей ячейке прототипа.

Другие вопросы по тегам