2010-07-11 93 views
0

我很难理解iPhone应用程序中响应器链的工作原理。如何恢复以前的firstResponder?

我的情况如下。我有两个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

The docs on UIResponder还有Event handling guide for iPhone OS表明响应链是不完全的规定,您如何希望它是。它并不是一个可以被追踪和被追踪的潜在响应者链接。相反,它直接与当前呈现给用户的视图层次关联。

这是什么意思是当B辞职的第一个响应者时,B的视图控制器(如果有的话)或者它的超级视图成为第一响应者,假设已经执行canBecomeFirstResponder:。如果它不能,视图控制器或超级视图成为第一响应者,一路达到UIApplication

如果A和B都没有在层次结构中,其中一个是另一个的子视图,响应链不会第一响应回归A当B辞职。相反,B将辞退第一响应者的超级观点。你最可能要做的就是在A和B之上的视图中实现becomeFirstResponder:。该方法只需将第一响应者交给A即可。这样,B可以抢先响应者,之后当它退出时,超级观点会把它交回A.

+0

谢谢,我试了一下,你的解释是有道理的。视图B是否成为第一响应者实际上并不重要。只要我切换到其选项卡,视图A就停止成为第一响应者,并停止获取远程控制事件。 在我的情况下,常见的超级视图可能是标签栏控制器的视图。我必须继承UITabBarController来做我想要的吗? – user332000 2010-07-13 04:50:05

+0

是的 - 子类UITabBarController似乎工作。当没有其他人在监听时,该子类获取远程控制事件。现在我所要做的就是找出将事件派往正确位置的一种优雅方式。 – user332000 2010-07-13 05:04:41

+0

调用A的“becomeFirstResponder:”方法将第一响应者交给A.IIRC。 – Kalle 2010-07-13 08:08:59