2016-02-29 87 views
2

我被困在问题“keyboardWillShow”触发两次,但“keyboardWillHide”调用一次。keyboardWillShow fire两次

这里是an example,我在“keyboardWillShow”发射后立即打印键盘尺寸。 我也把断点放在“viewDidLoad”中,观察者只注册一次。 我已经添加了两个元素“UITextField”和“UITextView”,两者都是相同的行为。

我使用的是iOS 9.2,迅速郎,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") 
} 

} 

UPDATE

第一次与大小触发一次。 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

+1

我记得我之前得到过这个,它还有一个Xcode或者iOS 9的bug ......所以我添加一个BOOL然后在'keyboardWillShow'上设置为YES,然后执行代码 – Tj3n

+0

听起来不像您在此处使用的是除默认键盘之外的任何内容,但在使用第三方键盘的情况下,系统将使用系统键盘的高度调用一次,然后再次使用您使用的实际键盘的高度一旦扩展加载。 – pbush25

回答

0

问题已连接到模拟器 在真实设备上,它会按照应该触发一次。

1

也许您订阅了多个UIKeyboardWillShowNotification,并忘记取消订阅它们。

尝试将观察者添加到viewWillAppear中并将其从viewWillDisappear中删除。

+0

已经做了,没有帮助:( – mihatel

+0

在您的项目中搜索UIKeyboardWillShowNotification并将其删除,看看它是否有帮助 –

+0

我没有任何其他代码除了在这里提供 如果您检查[示例](https ://github.com/x-hovo-x/KeyboardWillShow.git)你会看到这是一个简单的视图应用程序,带有一个视图,代码在这里提供。 – mihatel

0

你只是进入这个ViewController或者你是否浏览了几个ViewControllers?现在我看不到任何代码退订通知,这意味着再次输入此ViewController时,它将再次订阅(提供其方法再次运行)。奇怪的是,只有其中一人发生了两次。好的做法是在相应的相反方法中订阅和取消订阅。如果您在ViewDidLoad中订阅,则退订时取消订阅。如果您在viewWillAppear订阅,离开ViewController当退订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) 
} 

检查,以便DEINIT运行。

+0

我只有一个ViewController,这是最初的一个,没有任何导航。 一般你是对的,但我不想添加“不必要的”部分到我的[示例](https://github.com/x-hovo-x/KeyboardWillShow.git) 另外我已经写了我把断点进入viewDidLoad并且注册只发生一次 – mihatel

+1

啊,错过了那个抱歉,你的代码和我使用的代码之间的唯一区别是我设置了Select或不同。不知道是否会有所作为,但不能伤害尝试: NSNotificationCenter.defaultCenter()。addObserver(self,selector:“showKeyboard:”,名称: ().addObserver(self,选择器:“hideKeyboard:”,名称:UIKeyboardWillHideNotification,object:nil) – ClockWise

+0

尝试了相同的结果。 但有趣的是,y位置不同 keyboardWillShow大小:(0.0,568.0,320.0,216.0) keyboardWillShow大小:(0.0,352.0,320.0,216.0) – mihatel

0

我删除所有添加的键盘并只保留系统,然后该方法只会触发一次。如果添加新键盘,该方法仍会触发两次。也许这是一个系统错误。 System Keyboard