我有这样的视图层次结构:
View Controller
UITableView
UITableViewCell
UITextField
我在自定义UITableViewCell
中有一个textField
,我的计划是让该textField
在用户点击单元格后立即成为FirstResponder。第一个问题是textField
正在获取触摸事件,因此未选择单元格,因此,当用户在textField
上单击鼠标右键时,未选择单元格,并且我无法更新所选的单元格UI 。尽管可以在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
}
}
有人知道如何解决此键盘显示/隐藏问题,为什么键盘会先隐藏自己然后在很短的时间内显示?
答案 0 :(得分:0)
您的代码中的问题是您正在禁用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
函数中。