keyboardWillShow开火两次

时间:2016-02-29 09:48:11

标签: ios swift keyboard-events

我遇到问题“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

5 个答案:

答案 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)

是否要设置文本输入特性-键盘类型?

示例::如果将“键盘类型”设置为“数字键盘”,则理想情况下它应该调用一次,但会被调用两次。请检查并确保。

解决方案::您可以维护布尔控件来检查键盘是否已经弹起,并在执行选择器代码块时检查其值。