我在继续编写高级开发人员的代码时遇到了一种编码模式,这种模式不仅奇怪,而且让我对很多事情感到好奇。然而,我谈到的模式是这样的:
- 有一个
UIViewController 的 View 有一个扩展的 UIView 实例作为 subview 附加到它上面。
- 此自定义
UIView 类具有上述 UIViewController 的引用。
UIViewController 中定义了一系列方法,负责处理UIView 中的事件。
- 由于这个
UIViewController 作为引用存在,我们的自定义 View 通过这个引用调用那些事件处理方法!
在这样的代码系统中,内存含义是什么?这与委托(delegate)模式有什么不同?什么情况下使用这种编码好吗?
Best Answer-推荐答案 strong>
虽然这种模式有点奇怪,但如果没有更多关于这个 subview 在做什么以及它需要通知 View Controller 什么的信息,我会毫不犹豫地谴责它。诚然,这里有一种微弱的代码气味,如果我冒险猜测,我敢打赌,这个 View 可能正在做一些现在通常会放在 View Controller 中的东西。
通常,当添加具有任何显着复杂性(或可能在不同 View 中重用)的 subview 时,人们会考虑 iOS 5 的一项功能,“ View Controller 包含”(参见 Creating Custom Container View Controllers 部分) >查看 Controller 编程指南或 WWDC 2011 视频 Implementing UIViewController Containment)。
如果使用 Storyboard,您可以使用 iOS 6 中引入的特殊“容器 View ”控件来实现大部分功能,该控件位于 Interface Builder 的“对象库”中(位于标准 Xcode 布局中右侧面板的底部)。如果以编程方式执行此操作,只需确保调用 UIViewController Class Reference 的“管理自定义容器中的 subview Controller ”部分中列出的适当方法。 .
当使用 View Controller 包含时,您有一个父 View Controller (主视图 Controller )和 subview Controller (管理 subview 的 View Controller )。在这种情况下,设计一个自定义协议(protocol)非常常见, subview Controller 通过该协议(protocol)将特定事件通知其父 View Controller 。但是,您可以使用内置的 parentViewController 属性,而不是添加您自己的自定义 delegate 属性,当您采用上述“ View Controller 包含”模式时,该属性会自动填充。
说了这么多,我可能会让实际问题驱动现有代码库是否需要重构。也许代码早于 iOS 5,但它是我们过去可能所做的可靠实现。底线,如果它有效,否则写得很好,并且清楚地定义了职责,你可能会决定留下足够好的单独。如果它有点模棱两可(正如没有讨论 protocol 可能暗示的那样),也许只需在 subview 和 View Controller 之间引入正式协议(protocol)以使接口(interface)明确。根据目前提供的有限信息,我们很难建议是否需要对代码进行更彻底的重构(使用类似 View Controller 包含的东西)。
关于ios - 一个有争议的类委托(delegate)事件通知模式,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/25596349/
|