如果我正确理解您的问题,您不希望键盘在用户点击 textField 时出现,而是应该仅在用户点击键盘按钮时出现,并且应该在点击其他按钮时关闭。
所有发布的答案大多只关注显示键盘的第二部分,并在点击按钮时将其关闭。更棘手的是当用户点击 textField 时防止键盘出现:)
您可以尝试的可能解决方案及其缺点:
解决方案 1:
尝试设置 textfield isEnabled = false 确保当用户点击 textField 时这将阻止键盘出现,但猜猜即使在调用 textfield.becomeFirstResponder() 时键盘也不会出现@ 啊哈麻烦 :)
解决方案 2:
实现 UITextField 委托的 textFieldShouldBeginEditing 并根据是点击按钮还是 textField 本身返回 true 或 false。
当然可以,但是你需要想办法告诉textFieldShouldBeginEditing为什么它是由于按钮或再次触摸 textField 的复杂性而触发的。
我的解决方案:
使用 2 个文本字段。一个永远禁用用户交互并使用另一个永远不会出现在用户面前但会在需要时显示键盘的 textField。
说得够多了,让我们写代码吧 :)
第 1 步:
假设您出现在屏幕上的 textField 称为 textField
textfield.isEnabled = false
这将确保您所做的任何键盘都不会出现在此键盘上。
第 2 步:
创建一个零帧的临时文本字段(用户永远不能点击:P)
tempTextField = UITextField(frame: CGRect.zero)
tempTextField.delegate = self
self.view.addSubview(tempTextField)
第 3 步:
现在当用户点击显示键盘按钮时,让您的临时 textField 成为第一响应者
tempTextField.becomeFirstResponder()
当用户点击其他按钮 resignFirstResponder 时,用于 tempTextField。
tempTextField.resignFirstResponder()
第 4 步:
但是,当用户键入时,我的 textField 上没有显示任何内容。等待简单实现
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == tempTextField {
self.textfield.text = (self.textfield.text ?? "") + string
}
return true
}
编辑:
您实际上并不需要两个文本字段,您也可以使用UILabel 和UITextField 来实现相同的目的。我选择 UITextField 是因为我不确定您的其他要求是什么!
问题已解决。希望对你有帮助:)