mihatel
mihatel

Reputation: 846

keyboardWillShow fire twice

I'm stuck with problem "keyboardWillShow" fires twice, but the "keyboardWillHide" called once.

Here is an example where I'm printing the keyboard sizes as soon as "keyboardWillShow" fires. I've also put breakpoint in "viewDidLoad" and the observer registers only once. I've added two elements "UITextField" and "UITextView" and for both it is the same behaviour.

I'm using iOS 9.2, swift lang., xcode 7

Below my 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")
}

}

UPDATE

First time it fires once with sizes: keyboardWillShow sizes: (0.0, 568.0, 320.0, 253.0)

for the rest it twice with different sizes:(second y position is changed also the height changed) keyboardWillShow sizes: (0.0, 568.0, 320.0, 216.0) keyboardWillShow sizes: (0.0, 352.0, 320.0, 216.0)

Upvotes: 5

Views: 3777

Answers (5)

Rohit saraf
Rohit saraf

Reputation: 511

Are setting the Text Input Traits - Keyboard Type?

Example: If you set the Keyboard Type as "Number Pad", ideally it should call once, but it gets called twice. Please check that and be sure.

Resolution: You can maintain a bool to check if the keyboard is already up or not, and check its value while executing the selector code block.

Upvotes: 1

Echo_C
Echo_C

Reputation: 1

I remove all added keyboards and leave only the system's , then the method will fire only one time.If add a new keyboard ,the method still fire two times. Maybe it's a system bug. System Keyboard

Upvotes: 0

mihatel
mihatel

Reputation: 846

Issue is connected to simulator On the real device it fires once as supposed to be.

Upvotes: 1

ClockWise
ClockWise

Reputation: 1519

Are you only entering this ViewController or are you navigating through several ViewControllers? Right now I can't see any code to unsubscribe from the notifications which means than once you enter this ViewController again it will subscribe again (providing its viewDidLoad method runs again). Weird that only one of them fires twice though. Good practice is to subscribe and unsubscribe in the respective opposite methods. If you subscribe in ViewDidLoad then unsubscribe in deinit. If you subscribe in viewWillAppear, unsubscribe in viewWillDisappear etc.

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)
}

Check so that deinit runs when leaving the ViewController.

Upvotes: 0

Oleg Gordiichuk
Oleg Gordiichuk

Reputation: 15512

Probably you subscribe to more than one UIKeyboardWillShowNotification and forgot to unsubscribe from them.

Try to add observer in viewWillAppear and remove it in viewWillDisappear.

Upvotes: 2

Related Questions