在swift中单个对象的NSNotification

时间:2015-09-01 17:46:07

标签: ios swift uitextfield nsnotification virtual-keyboard

我分别在屏幕的顶部和底部有两个文本字段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。

我假设解决这个问题的关键在于这些方法中的object参数,我目前在bottomTextField中传递。 Apple's documentation for NSNotificationCenter表示该参数适用于

  

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

     

如果您通过nil,通知中心不会使用通知的发件人来决定是否将其发送给观察者。

我解释这意味着我们可以调用一个特定的对象来监听,所以在这种情况下是bottomTextField。但是当我改变那些来自" nil" to" bottomTextField"视图不再向上滑动,bottomTextField仍然隐藏。我不正确地解释这个吗?如果没有,我该怎么做才能让它发挥作用?如果我不正确,有没有办法隔离单个对象来监听NSNotification?

1 个答案:

答案 0 :(得分: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....
}

希望它足够清楚......