2012-08-03 113 views
2

只为初学者:我已经在听键盘会出现/消失/更改通知。他们没有射击。也没有出现/消失/改变。如何在控制器之间保持状态时检测iOS键盘?

当我有了键盘,并推上了一个控制器顶部也有键盘( - [UITextView成为FirstFirstResponder]在viewWillAppear),没有键盘通知被激发。这是有道理的,因为在这个动画中键盘实际上并不是移动,但在这种情况下肯定不是所期望的。

我该如何检测这种情况,以及/或者如何在没有通知被触发时获取键盘的当前位置?全球共享的听众是一种选择,但如果可能的话,我宁愿避免这种情况。

+0

我敢肯定,你见过[此相关的问题(http://stackoverflow.com/a/1492436/335858)了,但如果你没有, 这里是。 – dasblinkenlight 2012-08-03 19:02:58

+0

是的,那是我的备份计划。尽管该代码片段非常糟糕,但行为明智 - 似乎没有人用多个键盘布局检查他们的行为(例如,日语比美国键盘高)。你不能相信高度是一个一致的值。 – Groxx 2012-08-03 19:19:53

+0

是的,那里的代码看起来像一个解决方案的骨架草图,但它有足够的信息来构建自己的。 – dasblinkenlight 2012-08-03 19:24:08

回答

0

您将需要找到firstResponder,并且如果它的UITextField或UITextView,然后键盘启动或移动。没有任何通知意味着它已经存在,所以它的旧框架(相对于窗口)仍然有效。不幸的是,没有简单的方法来找到firstReponder。我抓住了一些代码递归地遍历所有当前视图的子视图,寻找它。

编辑:

- (UIView *)findFirstResponder 
{ 
    if (self.isFirstResponder) { 
     return self;  
    } 

    for (UIView *subView in self.subviews) { 
     UIView *firstResponder = [subView findFirstResponder]; 
     if (firstResponder) return firstResponder; 
    } 
    return nil; 
} 
+0

是的,我所做的是在viewWillDisappear()处理程序中处理...如果您有一个带有文本字段的ViewController,只需在viewWillDisappear中执行[txtField resignFirstResponder]。 – CSmith 2012-08-03 18:30:42

+0

似乎我仍然需要某种包含旧框架的共享全局,或者使用一些更可怕的循环遍历所有视图查找键盘黑客,它们疯狂脆弱以知道当前帧是什么。 含义:这是一个选项,但我可能会为此共享“键盘状态”对象。 – Groxx 2012-08-03 18:39:52

+0

如果你看看窗口的子视图,那里不是键盘视图吗?如果是这样,你可以通过这种方式得到它的框架获得第一响应者的方法并不那么可怕,而且效果很好 - 我在我的应用程序中使用它。它不像它在关键时刻运行并影响性能。 – 2012-08-03 19:31:25

相关问题