激活 UITextField 时立即更改第一响应者



我已经在这个问题上停留了一段时间。

我有一个inputAccessoryView,我想用于我的键盘,inputAccessoryView里面有一个UITextField。这是应该激活键盘的文本字段,但不能激活,因为它存在于inputAccessoryView中。

我有第二个UITextField通过视图控制器的viewDidLoad添加到托管视图中。这第二个UITextField是隐藏的,只是通过becomeFirstResponder激活键盘的一种方式。

我为我的自定义inputAccessoryView设置了一个委托,当用户关闭属于附件视图中存在的文本字段的键盘时,将调用该委托。我在这个委托函数中也有代码,也可以在第二个隐藏键盘上resignFirstResponder。这工作得很好,花花公子。

我目前遇到的问题是在becomingFirstResponder时获得类似的行为。我想让它成为当隐藏的键盘成为第一响应者时,它会立即在附件视图中的第二个键盘上呼叫第一响应者,让它看起来像是一开始就被激活了。

我不确定如何实现这一目标。我尝试在我的视图控制器上实现UITextField's委托并覆盖textFieldDidBeginEditing并在那里进行becomeFirstResponder调用,但无济于事。

关于为什么这不起作用的任何解释,或者采取其他方法?

编辑:我遵循了这里的建议。它确实允许第一响应者的所有权转移,但这样做有点生涩(以前的键盘仍然显示一瞬间),现在以前运行良好的resignFirstResponder过程根本不起作用。我猜textFieldDidBeginEditingresignFirstResponder呼叫期间被触发,并再次呼叫becomeFirstResponder。我现在无法关闭键盘。

在开始一个新的空项目并闲逛了一会儿之后,我想出了以下解决方案,到目前为止,它似乎运行良好且符合预期。

import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
var accessory: CustomView!
var denyFirstResponder = false
var dismissTap: UITapGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
accessory = CustomView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 44))
textField.inputAccessoryView = accessory
textField.delegate = self
dismissTap = UITapGestureRecognizer(target: self, action: #selector(shouldDismiss))
view.addGestureRecognizer(dismissTap)
}
func shouldDismiss(_ recognizer: UITapGestureRecognizer) {
accessory.textField.resignFirstResponder()
}
@IBAction func buttonPressed(_ sender: UIButton) {
textField.becomeFirstResponder()
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if denyFirstResponder {
denyFirstResponder = false
return false
}
return true
}
func textFieldDidBeginEditing(_ textField: UITextField) {
denyFirstResponder = true
accessory.textField.perform(#selector(becomeFirstResponder), with: nil, afterDelay: 0)
}
}
class CustomView: UIView {
var textField: UITextField!
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.blue
textField = UITextField(frame: CGRect(x: 10, y: 10, width: frame.width - 20, height: 24))
addSubview(textField)
textField.keyboardType = .decimalPad
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

最新更新