keyboardWillShow fire 两次

Posted

技术标签:

【中文标题】keyboardWillShow fire 两次【英文标题】:keyboardWillShow fire twice 【发布时间】:2016-02-29 09:48:11 【问题描述】:

我遇到问题“keyboardWillShow”会触发两次,但“keyboardWillHide”会调用一次。

这里是an example,只要“keyboardWillShow”触发,我就会在其中打印键盘尺寸。 我还在“viewDidLoad”中设置了断点,并且观察者只注册了一次。 我添加了两个元素“UITextField”和“UITextView”,它们的行为相同。

我使用的是 ios 9.2,swift lang.,xcode 7

在我的视图控制器下面

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)

【问题讨论】:

我记得我以前得到过这个,它有点像 Xcode 或 iOS 9 的错误,所以我添加了一个 BOOL 然后在keyboardWillShow 上将其设置为 YES 然后执行代码 这里听上去好像除了默认键盘外什么都没有,但是在使用第三方键盘的情况下,系统会以系统键盘的高度调用一次,然后在扩展加载后再次使用您正在使用的实际键盘的高度。 【参考方案1】:

可能您订阅了多个UIKeyboardWillShowNotification,却忘记退订了。

尝试在viewWillAppear 中添加观察者并在viewWillDisappear 中删除它。

【讨论】:

在您的项目中搜索 UIKeyboardWillShowNotification 并将其删除,看看是否有帮助 除了此处提供的代码外,我没有任何其他代码。如果您查看an example,您将看到这是一个简单的视图应用程序,其中一个视图带有此处提供的代码。【参考方案2】:

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

【讨论】:

实际上对我来说 iphone7(真实设备)keyboardWillShow 被调用了两次。在模拟器上它被调用一次。但距离答案已经过去了 3 年。只是在这里记下它,这样有人可能会觉得它有用。 如果您提供代码示例,我会尝试让您知道在我的真实设备上发生了什么。 我发现我的与拥有安全文本字段有关。在 uitextfield 上设置 isSecureEntry 会调用 keyboardWillShow 通知。【参考方案3】:

您是仅输入此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)

检查以便 deinit 在离开 ViewController 时运行。

【讨论】:

我只有一个 ViewController,这是初始的,没有任何导航。一般来说你是对的,但我不想在我的example 中添加“不必要的”部分。另外我已经写了我把断点放入 viewDidLoad 并且注册只发生了一次。 啊,错过了,抱歉。您的代码和我使用的代码之间的唯一区别是我设置了不同的选择器。不知道它是否会有所作为,但可以尝试:NSNotificationCenter.defaultCenter().addObserver(self, selector: "showKeyboard:", name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter()。 addObserver(self, selector: "hideKeyboard:", name: UIKeyboardWillHideNotification, object: nil) 尝试了同样的结果。但有趣的是 y 位置是不同的 keyboardWillShow 尺寸:(0.0, 568.0, 320.0, 216.0) keyboardWillShow 尺寸:(0.0, 352.0, 320.0, 216.0) 听起来第二次触发是在 viewDidLayoutSubviews 之后。不知道为什么。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

你的意思是你试过了,这是一个案例?否则,已经有解释(正确答案),问题与模拟器有关。为什么我写'是'因为我有一段时间没有检查它。对我来说,只是好奇,你为什么决定写一个答案,因为你遇到了同样的问题? 是的,我遇到了同样的问题,但没有任何帮助。终于意识到我发布的内容,以帮助面临同样问题的人。

以上是关于keyboardWillShow fire 两次的主要内容,如果未能解决你的问题,请参考以下文章

在 ios 8.3 及更高版本中,UIAlertView 导致 keyboardWillShow & keyboardWillHide 调用了两次

Fire! -两次dfs

两次BFS-简单搜索练习3

POJ 2152 Fire

BFS Fire! UVA - 11624

codeforce 35C fire again