0

我为长标题道歉,但它确实是我能想到的最短的准确和描述性的版本。

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

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

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

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

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

那么,除了我已经描述的两种解决方案之外,还有什么建议吗?

4

2 回答 2

1

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

请参阅 NSObject 的-conformsToProtocol:.

于 2013-01-09T04:05:25.467 回答
0

在给它更多的思考和试验之后,我想出了第三种方法:分类。它仍然不像我想要的那样通用,但比我以前的有所进步,并且不再依赖于子类化内置容器控制器。

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

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

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

于 2012-09-25T13:16:40.303 回答