Swift 2 为带有对象参数的特定文本字段添加观察者

Swift 2 addObserver for specific textField with the object parameter

据我了解,addObserver 方法的 object 参数是您要从中接收通知的对象。大多数时候我将其视为 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)
}

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)
}

然后在 keyboardWillShow: 方法中我有:

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 没有触发通知,但是键盘,当你将发送者传递给对象参数时,只有这个发送者发送的通知才会传递给观察者,如果你使用 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;
}

First, am I understanding the addObserver method correctly (especially the object parameter)

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

second, why is it not registering notifications from self.bottomTextField

您正在观察错误的通知。 UITextField 永远不会发送 UIKeyboardWillShowNotification -- 这是来自 window 的通知。如果您为 object 参数指定 nil,则您会从发送它的任何对象(包括 window)获得通知。但是当您将文本字段指定为对象参数时,您根本不会收到任何通知,因为文本字段不会发送该通知。您应该改为观察 UITextFieldTextDidBeginEditingNotificationUITextFieldTextDidEndEditingNotification,它们是 UITextField 发送的通知。