此处出现意外行为。 我有一个由tableview和带有textView的底栏组成的聊天。 当用户选择textView时,键盘会出现。
我使用通知UIKeyboardWillShowNotification
来修改tableview的框架。
选择一行会显示UIAlertController
,其中包含删除键盘的不同操作。
这个UIAlertController
有一个取消动作,即删除单元格的选择(通过选择我的意思是当单元格的选定状态为真时出现的灰色样式)。
通过将cell.selected
设置为false来删除选择。
问题是,当键盘出现时,再次选择此先前选择的单元格,我试图循环遍历单元格以将它们全部置于选定的false但是根据单元格所在的位置,所选状态仅在滚动后出现,使我的循环无效。
由于我没有在我的代码中手动选择单元格,我认为这是一种可能来自框架更改的行为? 我有什么办法可以解决这个问题吗?
答案 0 :(得分:1)
创建一个indexPath变量以便稍后引用它
var indexPath: IndexPath?
在tableView委托内,didSelect Row将选定的indexPath分配给您创建的那个
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.indexPath = indexPath
}
在您正在侦听键盘通知的函数内部,使用引用的indexPath取消选择所选行
func keyboardDidShow(notification: Notification) {
// your existing code...
if let indexPath = indexPath {
// deselect the selected row. I set animation to false
tableView.deselectRow(at: indexPath, animated: false)
// just a clean up set the indexPath to nil once done
self.indexPath = nil
}
}
这是解决问题的一种方法。
每个Cell都有一个selectedView,您可以将ViewsColor视图设置为clearColor,然后选择该行,但您不会看到它。或者您可以为selectedBackgroundView返回自己的视图。
答案 1 :(得分:0)
添加一些代码将有很大帮助。 信息有限,这就是我的感受:
这可能是由于重复出列的单元格(因为在触发键盘通知时对表格进行了更改)。
这是我的一般做法:
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: CELL_REUSE_IDENTIFIER)
prepareDequeuedCellForReuse(cell)
prepareDequeuedCellForReuse有类似这样的内容:
private func prepareDequeuedCellForReuse(_ dequedCell: UITableViewCell){
dequedCell.textLabel?.text = ""
dequedCell.tag = -1;
dequedCell.isSelected = false
}
我建议你在这里清除选择。