从自定义容器视图控制器将消息传递给包含容器视图控制器的子项?

时间:2012-09-25 08:46:52

标签: ios uiviewcontroller parent-child message-passing containment

我对长标题表示道歉,但它确实是我能想出的最准确和最具描述性的版本。

我正在使用自定义segue类型实现自定义容器视图控制器,使用iOS 5和故事板。我还为包含的视图控制器提供了一个委托协议,其工作方式与UINavigationControllerDelegate非常相似。目前我正在从我的自定义容器发送一个委托消息,该消息通知来自segued-from子视图控制器的与我的自定义segue相关的条件,它需要知道要执行某个操作。

这对我自己的UIViewController子类来说很简单,我可以指定这些子类符合.h文件中的协议。

但是,当我的自定义容器的包含视图控制器本身就是内置容器(例如UINavigationController,UITabBarController)时,我发送的委托消息对于包含的容器不一定有意义,但它会用于该容器当前显示的活动子视图控制器。内置容器显然会将通常的view(Will|Did)(Disa|A)ppear调用转发给他们的孩子,但我没有看到将该转发扩展到我的自定义消息的通用方法。

快速而肮脏的解决方案是将该内置容器子类化并向其添加委托消息转发。例如,MyTabBarController将符合委托协议并将委托消息转发给其selectedViewController。另一种方法是我的自定义容器主动嗅探它包含的视图控制器本身就是容器类型,但这甚至更脏,并且无法考虑将来有可能嵌套在我的自定义容器中的容器类型。

这整个自定义包含安排非常特定于我当前的应用程序,所以我可以破解它,因为我知道要求是什么,我不需要使这个通用,但我确定我希望在这个领域遵循良好的设计实践,以防万一我需要通过未来应用程序中的潜在重用来使其在未来更加通用。

那么,除了我已经描述的两种解决方案之外的任何建议?

2 个答案:

答案 0 :(得分:1)

我会使用正式的协议,当父母想要与孩子沟通时,只要问它是否符合协议。与类别类似,但每次调用类别方法时都不必询问e实例。只要询问它是否响应协议一次,然后你可以调用你想要的任何协议方法。

请参阅NSObject的-conformsToProtocol:

答案 1 :(得分:0)

经过多次思考和尝试后,我提出了第三种方法:类别。它仍然没有我想要的那么通用,但是与我之前的步骤不同,不再依赖于子类化内置容器控制器。

根据我的特定需求,我想要一个标签栏控制器将委托消息转发到其选定的视图控制器。我在UITabBarController上创建了一个名为MessageForwarding的类别,其中包含正确方法签名的实现。类别方法只是将相同的调用转发给self.selectedViewController,返回结果。

我的自定义容器类然后导入了这个类别,而且,标签栏控制器现在神奇地做了正确的事情并转发我在容器中发送的委托消息。

对于拆分视图和导航控制器以及任何需要使用的自定义容器,实现类似的类别都是微不足道的。