【问题标题】:Table View Cell Selection Error表视图单元格选择错误
【发布时间】:2015-11-25 20:29:33
【问题描述】:

我有一个表格视图,用户可以在其中选择朋友。我的问题是,由于某种原因,当一个单元格被选中时,另一个不相关的单元格也被选中。谁能帮我理解发生了什么?

这是我处理选择的代码:

 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”。反之亦然。

【问题讨论】:

  • 那么,您使用哪些方法来处理选择?
  • @CeceXX 等一下,让我用代码编辑我的问题。
  • @CeceXX 好的,我编辑了它
  • @CeceXX 奇怪的是,如果朋友列表没有超出显示的表格视图,问题就不会发生。仅当您必须向下滚动才能看到的可见框下方有朋友时才会发生这种情况。

标签: ios swift pftableviewcell


【解决方案1】:

由于参数中已经有 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 方法。

【讨论】:

  • 我使用的是 PFTableView,所以我认为我不能使用它。 allFriends 只是一个辅助数组,以便我可以跟踪选择的朋友。表格视图正在由查询填充。
  • 好的,我通过将图像的逻辑放在 cellForRowAtIndexPath 中,就像你说的那样。感谢您的帮助!
【解决方案2】:

当您reloadData 时,您的单元格将从原型单元格重新生成以重复使用。如果您不添加根据 cellForRowAtIndexPath 中的数据源设置此图像的功能,则该图像将始终默认为原型单元格中的那个。

【讨论】:

  • 那我应该尽量不使用 reloadData 吗?
  • 不,您应该在填充UITableView 时尝试在cellForRowAtIndexPath 方法中添加currentCell.Invited.image = UIImage(named: "checked.png") 之类的内容
  • 是的,因为我做了一些调试,并且不应该被选中的用户没有被添加到 allFriends 数组中。只是图像由于某种原因发生了变化。我会试试这个。
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多