Ios 带对象参数的特定文本字段的Swift 2 addObserver
据我所知,Ios 带对象参数的特定文本字段的Swift 2 addObserver,ios,uitextfield,swift2,nsnotificationcenter,addobserver,Ios,Uitextfield,Swift2,Nsnotificationcenter,Addobserver,据我所知,addObserver方法的object参数就是您希望从中接收通知的对象。大多数情况下,我将其视为nil(我假设这是因为所有对象都需要指定类型的通知)。在我的特殊情况下,我在屏幕顶部和底部都有一个文本字段,我希望只有当用户点击底部文本字段而不是顶部文本字段时,视图才会向上移动。因此,我在视图中调用以下方法将出现 func subscribeToKeyboardNotifications() { NSNotificationCenter.defaultCenter().addOb
addObserver
方法的object
参数就是您希望从中接收通知的对象。大多数情况下,我将其视为nil
(我假设这是因为所有对象都需要指定类型的通知)。在我的特殊情况下,我在屏幕顶部和底部都有一个文本字段,我希望只有当用户点击底部文本字段而不是顶部文本字段时,视图才会向上移动。因此,我在视图中调用以下方法将出现
func subscribeToKeyboardNotifications() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: self.bottomTextField)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: self.bottomTextField)
}
键盘将显示:
和键盘将隐藏:
选择器调用对视图帧进行重新定位的方法。我尝试将对象
参数设置为nil
,但这将从两个文本字段接收通知。我尝试将对象
参数设置为self.bottomTextField
(如上所示),但这两个文本字段都没有收到通知。我的问题有两方面。首先,我是否正确理解了addObserver
方法(尤其是对象
参数),其次,为什么它没有注册来自self.bottomTextField
的通知。谢谢
解决方案:
我知道这并不是我所问问题的解决方案,但我最后做了什么,使视图在只点击底部文本字段时向上移动,如下所示:
func subscribeToKeyboardNotifications() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
然后在键盘上显示:
方法我有:
func keyboardWillShow(notification: NSNotification) {
if bottomTextField.editing { // only reset frame's origin if editing from the bottomTextField
view.frame.origin.y -= getKeyboardHeight(notification)
}
}
希望这有帮助 因为在您的代码中,self.bottomTextField
没有触发通知,但是当您将发送者传递给object param时,键盘只会将该发送者发送的通知发送给观察者,如果您使用nil
则表示所有源都会收到该通知
要解决此问题,您必须转换textfield点以获取textfield或使用textfield委托,例如textFieldShouldBeginEditing
和textFieldShouldEndEditing
,这些委托具有textfield参数
获取当前响应者文本字段的类别:
#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;
}
首先,我是否正确理解addObserver方法(尤其是对象参数)
是的,您已经收到了。指定nil
意味着您将收到通知,无论是哪个对象发送的通知;提供指向对象的指针意味着您正在观察来自该特定对象的通知
第二,为什么它不从self.bottomTextField注册通知
您看到了错误的通知。UITextField
从不发送UIKeyboardWillShowNotification
——这是来自窗口的通知。如果为object
参数指定nil
,则会从发送它的任何对象(包括窗口)获取通知。但是,当您将文本字段指定为对象参数时,您根本没有收到任何通知,因为文本字段不发送该通知。相反,你应该观察uitextfieldtidbegineditingnotification
和uitextfieldtidendeditingnotification
,它们是UITextField
发送的通知。我不太明白你在第一句话中的意思。你是说self.bottomTextField
不会触发通知,而是要求键盘显示,键盘调用通知?所以当我使用nil时,它会从键盘接收通知?就解决问题而言,“你必须转换你的textfield点以获得textfield”是什么意思?是的,你理解正确,但当你传入object param时,它将只观察该对象,但当它为零时,它将从所有来源进行观察,指的是调用选择器的任何对象触发器,以便我对其进行修复,我在UIResponder
中得到了一个类别,它返回当前响应程序(带键盘的文本字段)并使用it@bagelboy听起来不错——在更仔细地查看了您的代码之后,我更新了答案,使用了更可能的罪魁祸首。啊,这很有道理。谢谢你的澄清!然而,在阅读这些通知的文档时,它说“没有使用userInfo字典”那么,我如何才能访问在计算过程中使用的键盘大小呢?@bagelboy查看UIWindow
发送的其他通知——就在UIKeyboardWillShowNotification
下面,您会发现UIKeyboardWillChangeFrameNotification
,该通知有一个字典,上面有您要查找的键盘大小信息。