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
,那么您将从任何发送它的对象(包括窗口)获得通知。 但是,当您将文本字段指定为对象参数时,您根本没有收到任何通知,因为文本字段不会发送该通知。 您应该观察UITextFieldTextDidBeginEditingNotification
和UITextFieldTextDidEndEditingNotification
,它们是UITextField
发送的通知。
因为在你的代码中, self.bottomTextField
没有触发通知,但键盘,当你将发送者传递给对象参数时,只有这个发送者发送的通知被传递给观察者,如果你用nil
表示它将被接收所有来源
为了解决你的问题,你必须转换你的文本字段点来获取文本字段或使用文本字段委托,如textFieldShouldBeginEditing
和textFieldShouldEndEditing
其中有文本字段参数
获取当前响应者文本框的类别:
#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; }