Swift 2 addObserver特定的textField与对象参数

据我了解, addObserver方法的object参数是你想要接收通知的对象。 大多数时候,我认为它nil (我认为这是因为指定types的通知是从所有对象中获取的)。 在我的特殊情况下,我在屏幕的顶部和屏幕的底部有一个文本字段,我希望只有当用户点击底部文本字段,而不是顶部的时候,视图才会向上移动。 所以我在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) } 

keyboardWillShow:keyboardWillHide:select器调用方法来重新定位视图的框架。 我试图离开object参数nil但是会从两个文本字段接收通知。 我尝试设置object参数self.bottomTextField (如上所示),但不接收来自任何文本字段的通知。 我的问题是双重的。 首先,我正确理解addObserver方法(特别是object参数),其次,为什么不从self.bottomTextField注册通知。 谢谢!

解决scheme:我知道这不是我所问的确切问题的解决scheme,但是我最终做了什么以使视图向上移动,只需点击底部的文本字段即可:

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

然后在keyboardWillShow:方法中我有:

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

希望有帮助!

首先,我正确理解addObserver方法(尤其是对象参数)

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

其次,为什么不从self.bottomTextField注册通知

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

因为在你的代码中, self.bottomTextField没有触发通知,但键盘,当你将发送者传递给对象参数时,只有这个发送者发送的通知被传递给观察者,如果你用nil表示它将被接收所有来源

为了解决你的问题,你必须转换你的文本字段点来获取文本字段或使用文本字段委托,如textFieldShouldBeginEditingtextFieldShouldEndEditing其中有文本字段参数

获取当前响应者文本框的类别:

 #import "UIResponder+FirstResponder.h" static __weak id currentFirstResponder; @implementation UIResponder (FirstResponder) +(id)currentFirstResponder { currentFirstResponder = nil; [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil]; return currentFirstResponder; } -(void)findFirstResponder:(id)sender { currentFirstResponder = self; }