【问题标题】:UIView class has too many delegate methods to parent View Controller?UIView 类对父视图控制器的委托方法太多?
【发布时间】:2016-10-14 12:00:27
【问题描述】:

我是一个新手程序员,所以我想征求人们的意见/建议,看看他们在我所处的情况下会做什么。

背景

由于我用来实现类似窗口的“弹出”的库的限制,我目前正在开发一个 UIView 类(我们称之为Menu),它创建UIImagePickers 和各种其他视图控制器(VCs)。但是,由于 UIView 本身存在于它自己产生的任何 VC 之上,我不得不将任何 VC 创建方法委托给 Menu 的 parentVC,以便我可以关闭 Menu 视图,创建任何必要的 VC,然后(有时)另外恢复Menu 视图。

问题

我目前正在为任何具有Menu 视图的 UIViewController 复制和粘贴数百行委托方法。这些委托方法对于每个视图控制器都是相同的,并且存在在那里,因为这些方法具有UIViewController 特定功能,例如presentViewController。我很想将 parentVC 作为参数传递给Menu,以减少重复代码的数量,但这似乎是 MVC-unkosher。解决这个问题的好方法是什么?

【问题讨论】:

  • 创建MainViewController,然后将其子类化。在MainViewController 中实现你需要的所有方法。
  • 由于使用的是Swift,所以可以采用面向协议的编程;创建一个实现所有委托方法的扩展,然后您可以在任何需要它的视图控制器中简单地采用此扩展。这类似于使用子类,但更灵活,因为您可以根据需要采用多个扩展(协议)

标签: ios swift oop model-view-controller delegates


【解决方案1】:

我很想将 parentVC 作为参数传递给 Menu,以减少重复代码的数量,但这似乎是 MVC-unkosher。

那是因为 MVC 是一种过时的架构选择,导致了这种情况。这就是您可能在网络上到处都注意到的“Massive View Controller”的来源。

您的Menu 依赖于 parentVC。因此,我们称 parentVC 为依赖项。现代架构的一个基本原则是依赖注入,它允许您消除您引用的重复代码,并在其依赖关系中隔离测试Menu。退房

所以,不要害怕使用参数,你的直觉是正确的。拥抱参数的使用,并强调您正在采用“5 美分概念的 25 美元术语”(见第一个链接),敏捷设计模式被称为 依赖注入 。对于额外的酷点,不要将该参数设置为 UIViewController。定义一个仅具有Menu 所需访问权限的协议,并使该参数符合所述协议,并向 UIViewController 添加符合该协议的扩展。这使得在其他地方进行测试和重用变得更容易;更重要的是,您将参与面向协议的编程,这将使您处于时尚 Swift 设计模式的前沿。到时候没人会叫你新手。

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以像这样创建一个扩展程序

    extension SomeClass: ClassesDelegates {
        //some specific code that all Views will use
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多