我正在运行时动态填充UIScrollView
具有许多UITextField
字段的垂直。我遇到的问题是键盘会隐藏它出现的区域中的字段,这可能包括我正在编辑的字段。
我尝试了 Apple 文档中的KeyboardManagement解决方案,并尝试在textFieldDidBeginEditing
和上使用通知,textFieldDidEndEditing
但在这两种情况下的问题是,keyboardWillShow
有时通知首先出现,在这种情况下,它不会让我知道哪个字段是正在编辑的字段。
我在一个实现UITextFieldDelegate
协议的类中有这段代码,这个类的每个对象都持有对这些字段之一的引用,并作为委托工作
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeTextfield = self.valueTextField
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.activeTextfield = nil
}
该activeTextfield
变量是弱引用的变量UIViewController
,所有这一切都发生。在该视图控制器中,我有以下代码
class MyClass: UIViewController {
var activeTextfield: CustomTextField! // This is the variable I was talking about on the previous paragraph
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardWillShow(_ notification: Notification) {
if self.view.frame.origin.y == 0 {
guard let userInfo = notification.userInfo else { return }
guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardSize.cgRectValue
let textFieldFrame = activeTextfield!.frame // activeTextfield sometimes is nil because this notification happens before the previous code block
if textFieldFrame.origin.y + textFieldFrame.size.height > keyboardFrame.origin.y {
self.view.frame.origin.y -= keyboardFrame.height
}
}
}
@objc func keyboardWillHide(_ notification: Notification) {
if self.view.frame.origin.y != 0 {
guard let userInfo = notification.userInfo else { return }
guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardSize.cgRectValue
self.view.frame.origin.y += keyboardFrame.height
}
}
}
有什么方法可以强制UITextField
在键盘通知之前调用委托方法?
这是处理这种情况的正确方法吗?
如果不是,我应该如何处理?
谢谢
如您的问题所述:
在这两种情况下的问题是,keyboardWillShow 通知有时首先出现,在这种情况下,它不会让我知道哪个字段是正在编辑的字段
根据苹果文档中描述的事件序列,textFieldShouldBeginEditing
是调用的第一个委托方法。
这样你就可以
textFieldShouldBeginEditing
在委托中实现以设置您的活动文本字段,而不是textFieldDidBeginEditing
(确保您return true
从 textFieldShouldBeginEditing 允许编辑)keyboardDidShowNotification
代替keyboardWillShowNotification
.这将确保您UITextField
在获取键盘框架/详细信息之前已标记。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句