我分别在屏幕的顶部和底部有两个文本字段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?
答案 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....
}
希望它足够清楚......