我已经在这个问题上停留了一段时间。
我有一个inputAccessoryView
,我想用于我的键盘,inputAccessoryView
里面有一个UITextField
。这是应该激活键盘的文本字段,但不能激活,因为它存在于inputAccessoryView
中。
我有第二个UITextField
通过视图控制器的viewDidLoad
添加到托管视图中。这第二个UITextField
是隐藏的,只是通过becomeFirstResponder
激活键盘的一种方式。
我为我的自定义inputAccessoryView
设置了一个委托,当用户关闭属于附件视图中存在的文本字段的键盘时,将调用该委托。我在这个委托函数中也有代码,也可以在第二个隐藏键盘上resignFirstResponder
。这工作得很好,花花公子。
我目前遇到的问题是在becomingFirstResponder
时获得类似的行为。我想让它成为当隐藏的键盘成为第一响应者时,它会立即在附件视图中的第二个键盘上呼叫第一响应者,让它看起来像是一开始就被激活了。
我不确定如何实现这一目标。我尝试在我的视图控制器上实现UITextField's
委托并覆盖textFieldDidBeginEditing
并在那里进行becomeFirstResponder
调用,但无济于事。
关于为什么这不起作用的任何解释,或者采取其他方法?
编辑:我遵循了这里的建议。它确实允许第一响应者的所有权转移,但这样做有点生涩(以前的键盘仍然显示一瞬间),现在以前运行良好的resignFirstResponder
过程根本不起作用。我猜textFieldDidBeginEditing
在resignFirstResponder
呼叫期间被触发,并再次呼叫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)
}
}