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
,该通知有一个字典,上面有您要查找的键盘大小信息。