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 调用了两次