Swift 2 addObserver 用于带有 object 参数的特定 textField

sbr*_*bru 5 addobserver uitextfield nsnotificationcenter ios swift2

据我了解object,该addObserver方法的参数是您要从中接收通知的对象。大多数时候我认为它是nil(我认为这是因为所有对象都需要指定类型的通知)。在我的特定情况下,我在屏幕顶部和屏幕底部有一个文本字段,我希望视图仅在用户点击底部文本字段而不是顶部文本字段时向上移动。所以我调用以下方法viewWillAppear

func subscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: self.bottomTextField)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: self.bottomTextField)
}
Run Code Online (Sandbox Code Playgroud)

keyboardWillShow:keyboardWillHide:选择调用做视图的框架的重新定位方法。我尝试保留object参数,nil但会收到来自两个文本字段的通知。我尝试将object参数设置为self.bottomTextField(如上所示),但没有收到来自任一文本字段的通知。我的问题是双重的。首先,我addObserver是否正确理解了该方法(尤其是object参数),其次,为什么它没有从self.bottomTextField. 谢谢!

解决方案: 我知道这不是我所问的确切问题的解决方案,但我最终在仅单击底部文本字段时使视图向上移动的方法如下:

func subscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
Run Code Online (Sandbox Code Playgroud)

然后在keyboardWillShow:我有的方法中:

func keyboardWillShow(notification: NSNotification) {
    if bottomTextField.editing { // only reset frame's origin if editing from the bottomTextField
        view.frame.origin.y -= getKeyboardHeight(notification)
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!

Cal*_*leb 3

首先,我是否正确理解了 addObserver 方法(尤其是 object 参数)

是的,你已经明白了。指定nil意味着无论哪个对象发送通知,您都会收到通知;提供指向对象的指针意味着您正在观察来自该特定对象的通知。

其次,为什么它不注册来自 self.bottomTextField 的通知

您正在观察错误的通知。 UITextField从不发送UIKeyboardWillShowNotification——这是来自窗口的通知。如果您指定nilobject参数,那么您将从发送该参数的任何对象(包括窗口)获取通知。但是,当您将文本字段指定为对象参数时,您根本没有收到任何通知,因为文本字段不会发送该通知。您应该改为观察UITextFieldTextDidBeginEditingNotificationUITextFieldTextDidEndEditingNotification,它们是发送的通知UITextField