Ios 键盘将显示火两次

Ios 键盘将显示火两次,ios,swift,keyboard-events,Ios,Swift,Keyboard Events,我遇到了问题“keyboardWillShow”启动了两次,但“keyboardWillHide”调用了一次 这里是我打印键盘大小的地方,只要“keyboardWillShow”一出现。 我还将断点放在“viewDidLoad”中,观察者只注册一次。 我添加了两个元素“UITextField”和“UITextView”,这两个元素的行为是相同的 我使用的是iOS 9.2,swift lang,xcode 7 在我的ViewController下面 class ViewController: UI

我遇到了问题“keyboardWillShow”启动了两次,但“keyboardWillHide”调用了一次

这里是我打印键盘大小的地方,只要“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")
}

}
更新

第一次发射时,大小为: 键盘将显示大小:(0.0568.0320.0,253.0

对于其余部分,它会使用不同的尺寸两次:(第二个y位置也会改变,高度也会改变) 键盘将显示大小:(0.0568.0320.0,216.0
键盘将显示大小:(0.0,352.0,320.0,216.0

您可能订阅了多个
UIKeyboardWillShowNotification
,但忘记了取消订阅


尝试在
视图中添加观察者将出现
,并在
视图中删除它将消失

您是否仅输入此
视图控制器
,还是在多个
视图控制器
中导航?现在我看不到任何要取消订阅通知的代码,这意味着一旦您再次输入此
ViewController
,它将再次订阅(前提是它的
viewDidLoad
方法再次运行)。奇怪的是,他们中只有一个人开枪两次。好的做法是以相反的方式订阅和取消订阅。如果在ViewDidLoad中订阅,则在Denit中取消订阅。如果在
视图中订阅将出现
,则在
视图中取消订阅将消失

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

检查以确保Denit在离开连接到模拟器的
视图控制器时运行

在真正的设备上,它按预期发射一次

我删除所有添加的键盘,只保留系统的,则该方法将只触发一次。如果添加新键盘,该方法仍将触发两次。可能是系统错误。

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

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


分辨率:您可以维护一个bool来检查键盘是否已启动,并在执行选择器代码块时检查其值。

我记得我以前遇到过这个问题,它有点像Xcode或iOS 9之类的错误,因此,我添加了一个BOOL,然后在
键盘上将其设置为YES将显示
,然后执行代码。在这里,除了默认键盘之外,您听上去并没有使用任何东西,但在使用第三方键盘的情况下,系统将根据系统键盘的高度调用它一次,加载扩展名后,再次输入实际使用键盘的高度。在您的项目中搜索UIKeyboardWillShowNotification并将其删除,查看它是否有帮助我没有此处提供的任何其他代码。如果您检查,您将看到这是一个简单的视图应用程序,其中有一个视图和这里提供的代码。我只有一个ViewController,这是初始的,没有任何导航。一般来说,你是对的,但我不想在我的简历中添加“不必要”的部分。而且我已经写了我把断点放进了viewDidLoad,注册只进行了一次。啊,错过了,对不起。您的代码和我使用的代码之间的唯一区别是我设置选择器的方式不同。不知道这是否会有所不同,但不妨尝试一下:NSNotificationCenter.defaultCenter().addObserver(self,选择器:“showKeyboard:”,名称:UIKeyboardWillShowNotification,对象:nil)NSNotificationCenter.defaultCenter().addObserver(self,选择器:“hideKeyboard:”,名称:UIKeyboardWillHideNotification,对象:nil)尝试了同样的结果。但有趣的是y位置不同,键盘将显示大小:(0.0568.0320.0216.0)键盘将显示大小:(0.0352.0320.0216.0)听起来第二次触发出现在viewDidLayoutSubviews之后。不知道为什么。你是说你试过了,这是个案子?否则,已经有解释(正确答案),问题与模拟器有关。我之所以要写是因为我有一段时间没有检查它。对我来说,只是好奇,为什么你决定写一个答案,因为你遇到了同样的问题?是的,我遇到了同样的问题,没有任何帮助。终于意识到我所发布的内容是为了帮助面临同样问题的人们。事实上,对我来说,在iphone7(真正的设备)键盘上,Willshow会被呼叫两次。在模拟器上,它只调用一次。但这是3年以来的答案。只是在这里记下它,以便有人会发现它很有用。如果你提供一个代码示例,我会尝试让你知道我的真实设备上发生了什么。我发现我的设备与安全文本字段相关。在uitextfield上设置IsSecureRetry调用键盘将显示通知。