修改tableview框架后,最后选择的单元格状态为true

时间:2017-04-26 08:46:56

标签: ios swift uitableview

此处出现意外行为。 我有一个由tableview和带有textView的底栏组成的聊天。 当用户选择textView时,键盘会出现。

我使用通知UIKeyboardWillShowNotification来修改tableview的框架。

选择一行会显示UIAlertController,其中包含删除键盘的不同操作。

这个UIAlertController有一个取消动作,即删除单元格的选择(通过选择我的意思是当单元格的选定状态为真时出现的灰色样式)。 通过将cell.selected设置为false来删除选择。

问题是,当键盘出现时,再次选择此先前选择的单元格,我试图循环遍历单元格以将它们全部置于选定的false但是根据单元格所在的位置,所选状态仅在滚动后出现,使我的循环无效。

由于我没有在我的代码中手动选择单元格,我认为这是一种可能来自框架更改的行为? 我有什么办法可以解决这个问题吗?

2 个答案:

答案 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
}

我建议你在这里清除选择。