如何恢复以前的firstResponder?

时间:2010-07-11 09:00:53

标签: iphone objective-c cocoa

我很难理解响应者链在iPhone应用程序中是如何工作的。

我的情况如下。我有两个安装在标签栏控制器上的UIViewControllers。将它们称为视图控制器A和B.它们是无关的,因为它们都没有引用或者知道另一个。

A和B都需要响应遥控事件(播放/暂停/停止按钮)。控制器A想要一直响应这些事件,而B只想在用户选择某个功能时响应它们。当我的应用程序启动时,A立即成为第一个响应者,并且能够接收远程控制事件。当B想要接收事件时,它成为第一响应者,然后开始获取事件而不是A。

使用遥控器完成B时会出现问题。此时,B自己调用resignFirstResponder。此后,A和B都没有得到任何遥控事件。

我假设当B辞职第一响应者状态时,先前作为第一响应者的事物将被恢复。这不是它的工作原理吗?

如果没有,我该如何将A恢复为第一响应者?请记住,A和B是单独的选项卡,因此B没有对A的引用或者知道A应该是第一个响应者。所以我不想在A上显式调用becomeFirstResponder。我需要的是一种获取前一个响应者并恢复它的方法(我认为)。我有点不解为什么这不会自动发生。

谢谢, 弗兰克

1 个答案:

答案 0 :(得分:1)

The docs on UIResponder以及Event handling guide for iPhone OS表示响应者链未按照您的预期准确排列。它不是潜在响应者的链接链,可以加入和拉出。相反,它直接与当前呈现给用户的视图层次结构相关联。

这意味着当B辞职第一响应者,B的视图控制器(如果有的话)或其超级视图成为第一响应者时,假设已实现canBecomeFirstResponder:。如果不能,视图控制器或超级视图成为第一响应者,一直到UIApplication

如果A和B不在层次结构中,其中一个是另一个的子视图,则当B辞职时,响应者链不会将第一响应者返回给A.相反,B将第一响应者辞退到其超级视图。你最想做的是在A和B之上的视图中实现becomeFirstResponder:。该方法只需将第一个响应者交给A.这样,B可以抓住第一个响应者,之后,当它取消了它,超级视图将把它交还给A。