我遇到问题“keyboardWillShow”两次触发,但“keyboardWillHide”调用一次。
这里是an example,我会在“keyboardWillShow”触发时打印键盘大小。 我还在“viewDidLoad”中放置断点,观察者只注册一次。 我添加了两个元素“UITextField”和“UITextView”,两者都是相同的行为。
我正在使用iOS 9.2,swift lang。,xcode 7
在我的ViewController下面
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
print("keyboardWillShow sizes: \(keyboardSize)")
}
}
func keyboardWillHide(notification: NSNotification) {
print("HideHideHide")
}
}
更新
第一次用尺寸发射一次: keyboardWillShow尺寸:(0.0,568.0,320.0, 253.0 )
其余两次大小不同:(第二个y位置也改变了高度变化) keyboardWillShow尺寸:(0.0,568.0,320.0, 216.0 ) keyboardWillShow尺寸:(0.0, 352.0 ,320.0, 216.0 )
答案 0 :(得分:1)
您可能订阅了多个UIKeyboardWillShowNotification
,但忘了取消订阅。
尝试在viewWillAppear
中添加观察者并将其移除viewWillDisappear
。
答案 1 :(得分:0)
您是仅输入此ViewController
还是浏览多个ViewControllers
?现在我看不到任何代码要取消订阅通知,这意味着再次输入此ViewController
它将再次订阅(提供再次运行viewDidLoad
方法)。奇怪的是,他们中只有一人发射了两次。良好做法是订阅和取消订阅相应的相反方法。如果您在ViewDidLoad中订阅,则在deinit中取消订阅。如果您在viewWillAppear
订阅,请取消订阅viewWillDisappear
等
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
检查以便在离开ViewController
时运行deinit。
答案 2 :(得分:0)
问题已连接到模拟器 在真实的设备上它会发射一次。
答案 3 :(得分:0)
我删除所有添加的键盘并只留下系统,然后该方法只会触发一次。如果添加一个新键盘,该方法仍然会触发两次。也许这是一个系统错误。 System Keyboard
答案 4 :(得分:0)
是否要设置文本输入特性-键盘类型?
示例::如果将“键盘类型”设置为“数字键盘”,则理想情况下它应该调用一次,但会被调用两次。请检查并确保。
解决方案::您可以维护布尔控件来检查键盘是否已经弹起,并在执行选择器代码块时检查其值。