键盘不会随着 resignFirstResponder 消失
Keyboard doesn't go away with resignFirstResponder
我有一个视图控制器,它要求用户 select 做几件事。直接使用 UIPickerView 是行不通的,因为它们占用了太多空间。所以我有几个 UITextField,当用户 select 一个时,它会调出一个模态视图控制器。到目前为止它工作正常,除非已经有一个可见的键盘。当发生这种情况时,模态视图控制器会出现,但它会被之前的键盘覆盖。这个键盘似乎没有附加到任何 UITextField,因为在它上面按下键不会导致字符出现在任何 UITextField 中。尽管闪烁的光标确实出现在文本字段中。
protocol ModalPickerTarget {
var cancelCallback: (() -> Void)? { set get }
var selectCallback: ((String) -> Void)? { set get }
}
class ModalPicker<T> where T: UIViewController, T: ModalPickerTarget {
weak var controller: UIViewController!
weak var textField: UITextField!
init(textField: UITextField, controller: UIViewController) {
self.controller = controller
self.textField = textField
textField.addTarget(self, action: #selector(ModalPicker.show), for: .editingDidBegin)
}
@objc func show(sender: AnyObject) {
var modal = T()
print("First responder: \(self.textField.isFirstResponder)")
self.textField.resignFirstResponder()
modal.modalPresentationStyle = .overCurrentContext
modal.modalTransitionStyle = .crossDissolve
modal.cancelCallback = {
modal.dismiss(animated: true, completion: nil)
}
modal.selectCallback = {
modal.dismiss(animated: true, completion: nil)
self.textField.text = [=10=]
}
self.controller.present(modal, animated: true, completion: nil)
}
}
打印语句表明textField
是第一响应者。我也试过在父视图和模态视图上调用 endEditing
但没有效果。
这是一些屏幕截图
我们可以通过对控制器的对象使用 endEditing 来隐藏 UIViewController
的输入视图,如:
self.view.endEditing(true)
对于你的情况,使用:
controller.view.endEditing(true)
你必须在 textFieldShouldBeginEditing
上 return false
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
// Implement your Picker there
return false
}
我有一个视图控制器,它要求用户 select 做几件事。直接使用 UIPickerView 是行不通的,因为它们占用了太多空间。所以我有几个 UITextField,当用户 select 一个时,它会调出一个模态视图控制器。到目前为止它工作正常,除非已经有一个可见的键盘。当发生这种情况时,模态视图控制器会出现,但它会被之前的键盘覆盖。这个键盘似乎没有附加到任何 UITextField,因为在它上面按下键不会导致字符出现在任何 UITextField 中。尽管闪烁的光标确实出现在文本字段中。
protocol ModalPickerTarget {
var cancelCallback: (() -> Void)? { set get }
var selectCallback: ((String) -> Void)? { set get }
}
class ModalPicker<T> where T: UIViewController, T: ModalPickerTarget {
weak var controller: UIViewController!
weak var textField: UITextField!
init(textField: UITextField, controller: UIViewController) {
self.controller = controller
self.textField = textField
textField.addTarget(self, action: #selector(ModalPicker.show), for: .editingDidBegin)
}
@objc func show(sender: AnyObject) {
var modal = T()
print("First responder: \(self.textField.isFirstResponder)")
self.textField.resignFirstResponder()
modal.modalPresentationStyle = .overCurrentContext
modal.modalTransitionStyle = .crossDissolve
modal.cancelCallback = {
modal.dismiss(animated: true, completion: nil)
}
modal.selectCallback = {
modal.dismiss(animated: true, completion: nil)
self.textField.text = [=10=]
}
self.controller.present(modal, animated: true, completion: nil)
}
}
打印语句表明textField
是第一响应者。我也试过在父视图和模态视图上调用 endEditing
但没有效果。
这是一些屏幕截图
我们可以通过对控制器的对象使用 endEditing 来隐藏 UIViewController
的输入视图,如:
self.view.endEditing(true)
对于你的情况,使用:
controller.view.endEditing(true)
你必须在 textFieldShouldBeginEditing
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
// Implement your Picker there
return false
}