我有这样的 View 层次结构:
View Controller
UITableView
UITableViewCell
block 引用> block 引用> block 引用>UITextField
我的自定义有
UITableViewCell
一个textField
我的计划是做这个textField
一旦用户点击单元格,就会成为FirstResponder。第一个问题是textField
正在获取触摸事件并且因此未选择单元格,因此当用户右键点击textField
时那么单元格未被选择,我无法更新所选单元格的用户界面。我想我可以做isUserInteractionEnabled=false
上textField
所以当用户点击textField
后我的细胞中会有适当的选择行为。到目前为止,一切都很好。现在我想在setSelected
中处理这个选择我的自定义单元格中的方法。问题是,如果键盘已经在屏幕上并且我执行becomeFirstResponder()
上textField
然后键盘隐藏并立即再次显示。通常我希望这个键盘会留在原处,而不会尝试再次隐藏和显示。这是代码:class StringFieldTableViewCell: UITableViewCell { @IBOutlet weak var pinLine: UIView! @IBOutlet weak var pinLineFocused: UIView! @IBOutlet weak var textField: UITextField! override func awakeFromNib() { super.awakeFromNib() self.selectionStyle = .none self.textField.isUserInteractionEnabled = false } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) self.textField.isUserInteractionEnabled = selected if selected { self.textField.becomeFirstResponder() } self.pinLine.isHidden = selected self.pinLineFocused.isHidden = !selected } }
有谁知道如何解决这个键盘显示/隐藏问题以及为什么键盘首先尝试隐藏自己然后在很短的时间内显示?
最佳答案
代码中的问题是您禁用了文本字段交互,因为单元格中有文本字段,如果您点击单元格,您将与文本字段交互,而不是单元格本身。
因此,即使单元格中有 textField
,也有一种方法可以选择行。
首先,您需要获取点击该文本字段的时间。
为此你可以使用这个......
let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
它会给你一个 CGPoint([x, y]) 中的值,例如 [0.0, 0.0] 或 [0.0, 44.0]。取决于您的 Cell 的高度。
现在,有一个函数可以将 CGPoint 转换为 IndexPath。
let textFieldIndexPath = tableView.indexPathForRow(at: pointInTable)
现在这将是我们的索引路径。
现在您可以使用 cellSelected 函数了。
tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)
整个代码如下:
let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
let textFieldIndexPath = self.tableView.indexPathForRow(at: pointInTable)
tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)
您可以将其放入 textFieldDidBeginEditing
函数中。
关于ios - UITableViewCell 中的 UITextField 和所选单元格键盘上的变为FirstResponder 显示/隐藏故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54023006/