我有这样的视图层次结构:
查看控制器
UITableView
UITableViewCell
UITextField
我的自定义
UITableViewCell
中有一个textField
,我的计划是让这个textField
在用户点击单元格时立即成为第一响应程序。第一个问题是textField
正在获取触摸事件,因此单元格未被选中,因此当用户右键点击textField
时,单元格未被选择,我无法更新所选单元格UI。我想我可以在textField
上制作isUserInteractionEnabled=false
,这样在用户点击textField
后,我的单元格中就会有正确的选择行为。到目前为止还不错。现在我想在自定义单元格中的setSelected
方法中处理此选择。问题是,如果键盘已经在屏幕上,并且我在textField
上执行becomeFirstResponder()
,那么键盘将隐藏并立即再次显示。通常情况下,我希望这个键盘能保持原位,而不会试图再次隐藏和显示。这是代码: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交互,因为您的单元格中有textField,如果您点击单元格,您将与textField进行交互,而不是与单元格本身进行交互。
因此,有一种方法可以选择一行,即使您的单元格中有textField
。
首先,您需要知道何时点击该文本字段。
为此,你可以使用这个。。。。
let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
它将在CGPoint([x,y])中为您提供一个值,例如[0.0,0.0]或[0.0,44.0]。这取决于单元格的高度。
现在,有一个函数可以将CGPoint转换为IndexPath。
let textFieldIndexPath = tableView.indexPathForRow(at: pointInTable)
现在这将是我们的indexPath。
现在你可以使用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
函数中。