在Swift中为单个对象设置NSNotification

3

我有两个文本框,一个是topTextField,另一个是bottomTextField,分别位于屏幕的顶部和底部。当虚拟键盘弹出时,bottomTextField会被隐藏在后面,为了解决这个问题,我使用NSNotification来监听虚拟键盘,并在发生时将视图向上滑动。然而,每当键盘出现在屏幕上时,包括topTextField成为第一响应者时,视图都会向上滑动,有效地将其移出屏幕。以下是代码:

    func subscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: bottomTextField)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: bottomTextField)
}

func unsubscribeToKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: bottomTextField)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: bottomTextField)
}

在这些方法的末尾,我最初将“nil”作为对象参数,这时我开始寻找一种方法来仅将行为隔离到bottomTextField。

我认为解决这个问题的关键在于这些方法中的对象参数,其中我当前正在传递bottomTextField。 NSNotificationCenter的Apple文档说该参数是用于

观察者想要接收通知的对象;也就是说,只有由此发送者发送的通知才会传递给观察者。

如果您传递nil,则通知中心不使用通知的发送者来决定是否将其传递给观察者。

我理解这意味着我们可以调用特定的对象来监听,所以在这种情况下是bottomTextField。 但是,当我将它们从“nil”更改为“bottomTextField”时,视图不再向上滑动,并且bottomTextField仍然隐藏。 我的理解是否正确? 如果不是,有什么办法可以使其正常工作? 如果我理解错误,是否有一种方法来隔离单个对象以使用NSNotification进行监听?

1个回答

1
对象应该是nil,而非文本字段。
在处理程序中检查哪些文本字段被键盘“覆盖”。
-(void)keyboardHandler:(NSNotufication *)note {

Cgrect keyboardFrame = [note.userInfo[keyboardframe] cgrectvalue]; // dont remember the key name (answering from my phone :)). Check uiapplication header. 

// check which text field is covered and move it

// you may need to convert the rect coordinates using:

cgrect windowFrame = [[[uiapplication sharedapplication] keyWindow] convertRect:textfieldFrame fromView:textfield.superView]];

If (windowFrame is covered by keyboard ...) { 
    Move text field....
}

希望足够清晰....

谢谢您的回复。我修改了我的代码,检查哪个文本字段是第一个响应者,并在底部时移动键盘。现在运行得很好。我仍然有点困惑,如果不是像这样使用通知发送器(对象)参数,它将用于什么(我假设它没有起作用,因为发送通知的不是文本字段)。什么样的东西会发送通知?在什么情况下,我可能会将最后一个参数用作非nil值? - twp
在运行时,许多对象可能会发出相同的“通知名称”,您只想跟踪来自“特定”对象的通知(在注册时指定实例是有意义的)。在系统发出通知的情况下,通常没有必要注册到特定对象(很多时候它是单例并且实例很清楚)。此外,在某些情况下,通知的发射器没有在NSNotification对象中附加足够的上下文(也许notification.object == nil?),但您需要发布通知的实例。 - Avba
对于那些不知道如何检查哪个文本字段是第一响应者的人,请查看这个Stack Overflow - user3731622

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接