菜鸟教程小白 发表于 2022-12-13 01:23:58

ios - 一个有争议的类委托(delegate)事件通知模式


                                            <p><p>我在继续编写高级开发人员的代码时遇到了一种编码模式,这种模式不仅奇怪,而且让我对很多事情感到好奇。然而,我谈到的模式是这样的:</p>

<ol>
<li>有一个 <code>UIViewController</code> 的 View 有一个扩展的 <code>UIView</code> 实例作为 subview 附加到它上面。 </li>
<li>此自定义 <code>UIView</code> 类具有上述 <code>UIViewController</code> 的引用。 </li>
<li><code>UIViewController</code> 中定义了一系列方法,负责处理<code>UIView</code> 中的事件。 </li>
<li>由于这个 <code>UIViewController</code> 作为引用存在,我们的自定义 View 通过这个引用调用那些事件处理方法!</li>
</ol>

<p>在这样的代码系统中,内存含义是什么?这与委托(delegate)模式有什么不同?什么情况下使用这种编码好吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>虽然这种模式有点奇怪,但如果没有更多关于这个 subview 在做什么以及它需要通知 ViewController 什么的信息,我会毫不犹豫地谴责它。诚然,这里有一种微弱的代码气味,如果我冒险猜测,我敢打赌,这个 View 可能正在做一些现在通常会放在 ViewController 中的东西。</p>

<p>通常,当添加具有任何显着复杂性(或可能在不同 View 中重用)的 subview 时,人们会考虑 iOS 5 的一项功能,“ ViewController 包含”(参见 <em 的 <a href="https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html#//apple_ref/doc/uid/TP40007457-CH18-SW6" rel="noreferrer noopener nofollow">Creating Custom Container View Controllers</a> 部分) >查看 Controller 编程指南</em>或 WWDC 2011 视频 <a href="https://developer.apple.com/videos/wwdc/2011/?id=102" rel="noreferrer noopener nofollow">Implementing UIViewController Containment</a>)。 </p>

<p>如果使用 Storyboard,您可以使用 iOS 6 中引入的特殊“容器 View ”控件来实现大部分功能,该控件位于 Interface Builder 的“对象库”中(位于标准 Xcode 布局中右侧面板的底部)。如果以编程方式执行此操作,只需确保调用 <a href="https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW86" rel="noreferrer noopener nofollow">UIViewController Class Reference</a> 的“管理自定义容器中的 subviewController ”部分中列出的适当方法。 .</p>

<p>当使用 ViewController 包含时,您有一个父 ViewController (主视图 Controller )和 subviewController (管理 subview 的 ViewController )。在这种情况下,设计一个自定义协议(protocol)非常常见, subviewController 通过该协议(protocol)将特定事件通知其父 ViewController 。但是,您可以使用内置的 <code>parentViewController</code> 属性,而不是添加您自己的自定义 <code>delegate</code> 属性,当您采用上述“ ViewController 包含”模式时,该属性会自动填充。</p>

<p>说了这么多,我可能会让实际问题驱动现有代码库是否需要重构。也许代码早于 iOS 5,但它是我们过去可能所做的可靠实现。底线,如果它有效,否则写得很好,并且清楚地定义了职责,你可能会决定留下足够好的单独。如果它有点模棱两可(正如没有讨论 <a href="https://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/Protocol.html#//apple_ref/doc/uid/TP40008195-CH45-SW1" rel="noreferrer noopener nofollow">protocol</a> 可能暗示的那样),也许只需在 subview 和 ViewController 之间引入正式协议(protocol)以使接口(interface)明确。根据目前提供的有限信息,我们很难建议是否需要对代码进行更彻底的重构(使用类似 ViewController 包含的东西)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 一个有争议的类委托(delegate)事件通知模式,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25596349/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25596349/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 一个有争议的类委托(delegate)事件通知模式