UITableViewCell中的UITextField,并成为选定单元格键盘显示/隐藏故障的第一响应程序



我有这样的视图层次结构:

查看控制器

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函数中。

最新更新