5

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

希望这会有所帮助!

4

2 回答 2

3

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

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

二、为什么不从self.bottomTextField注册通知

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

于 2015-12-04T07:32:54.493 回答
1

因为在您的代码中,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;
}
于 2015-12-04T07:22:34.190 回答