这似乎是一个应该足够普遍的问题,它可以在线获得一个好的答案,但我找到了最难找到的问题。
基本上,我的问题是:UITableView
中有一个ViewController
,此表已启用MultipleSelection
。最初,如果我"检查" (即选中)单元格然后滚动直到它们不在屏幕上,当我向上滚动时复选标记消失了。我能够解决我在网上找到的第一个问题,但现在我遇到了一个新问题,必须与UITableView
重复使用单元格的方式有关:当我选择单元格时,它们也不恰当地选择关闭的单元格-screen。
在viewDidLoad
:
self.friendListTableView.allowsMultipleSelection = true
我实现了这两个功能:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
网上的一些地方说,应该存储一个单独的数据结构,跟踪是否选择了一个单元格,但其他人说这应该自动处理。不知道该相信什么。
我非常确定这里的问题是当我执行tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
时,会为屏幕索引设置复选标记,而不是相对于整个列表的实际索引。知道如何解决这个问题吗?提前致谢。
cellForRowAtIndexPath
功能......虽然它对选定的单元格没有做任何事情......也许应该这样做。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if self.friendRecords[0].count == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: NO_FRIENDS, for: indexPath)
return cell
}
let friend = self.friendRecords[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: FRIEND_CELL, for: indexPath)
if let friendCell = cell as? FriendTableViewCell {
friendCell.username.text = (friend.object(forKey: USERNAME) as! String)
if friend.object(forKey: REAL_NAME) == nil {
friendCell.name.isHidden = true
}
else {
friendCell.name.text = (friend.object(forKey: REAL_NAME) as! String)
}
if friend.object(forKey: PROFILE_PIC) == nil {
friendCell.profilePic.image = UIImage(named: DEFAULT_PROFILE_PIC)
}
else {
let img = friend.object(forKey: PROFILE_PIC) as! CKAsset
friendCell.profilePic.image = UIImage(contentsOfFile: img.fileURL.path)
}
}
return cell
}