ios - 将消息从自定义容器 View Controller 传递到包含的容器 View Controller 的子级?

标签 ios uiviewcontroller parent-child message-passing containment

我对长标题表示歉意,但这确实是我能想到的最短、准确和描述性的版本。

我正在实现一个具有自定义 Segue 类型的自定义容器 View Controller ,使用 iOS 5 和 Storyboard。我还为包含的 View Controller 提供了一个委托(delegate)协议(protocol),其工作方式与 UINavigationControllerDelegate 非常相似。目前,我正在从自定义容器发送一条委托(delegate)消息,该消息通知隔 ionic View Controller 与我的自定义 Segue 相关的条件,它需要了解该条件才能执行特定操作。

使用我自己的 UIViewController 子类就足够简单了,我可以指定它以符合 .h 文件中的协议(protocol)。

但是,当我的自定义容器包含的 View Controller 本身是内置容器(例如 UINavigationController、UITabBarController)时,我发送的委托(delegate)消息对于该包含的容器不一定有意义,但对于该容器当前显示的事件 subview Controller 。内置容器显然将通常的 view(Will|Did)(Disa|A)ppear 调用转发给它们的子项,但我没有看到将该转发扩展到我的自定义消息的通用方法.

快速而肮脏的解决方案是对该内置容器进行子类化并向其添加委托(delegate)消息转发。例如,MyTabBarController 将遵守委托(delegate)协议(protocol)并将委托(delegate)消息转发到其 selectedViewController。另一种方法是让我的自定义容器主动嗅探它包含的 View Controller 是否是其本身类型的容器,但这甚至更脏,并且无法考虑将来有一天可能嵌套在我的自定义容器中的容器类型。

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

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

最佳答案

我会使用正式的协议(protocol),当 parent 想要与 child 沟通时,只需询问它是否符合协议(protocol)即可。与类别类似,但您不必每次调用类别方法时都询问 e 实例。只需询问它是否响应协议(protocol)一次,然后您就可以调用您想要的任何协议(protocol)方法。

参见 NSObject 的 -conformsToProtocol:

关于ios - 将消息从自定义容器 View Controller 传递到包含的容器 View Controller 的子级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12579291/

相关文章:

sql-server-2005 - 将两个表之间的一对多关系复制到另外两个表 (SQL 2005)

c - 在 C 中,我编写了一个程序来使用 system() 调用一个 exe。 exe 要求用户输入。如何让我的程序提供输入?

ios - 为什么 String 会隐式变成 String!在 swift

objective-c - 确保在调用 loadView 之前完全设置 UIViewController

ios - 链接到 UIViewController 的自定义 UIView - 如何处理按钮操作

ios - 内存堆积,在ViewController之间切换,什么是ok的?

javascript - 尝试通过 Vue.js 中的渲染传递 Prop 并观看它们

ios - AWS DynamoDB Objective C 中递增 Number 属性

ios - QuickBlox 聊天 : can't perform video call

ios - 核心数据测试 : force external storage on iOS