iOS 上的自定义模板系统

Custom System of templates on iOS

我想为我的应用程序中的每个 viewController 使用一些不同的模板(比如 5 个,之后可以增加)。

我可以想到一些不同的方法:

  1. 5 个不同的情节提要在每个情节提要中重复相同的导航。由于应用 may/would 更改,我放弃了此选项,因为我必须在 5 个情节提要中重做我在导航中所做的每个更改。
  2. 有一个故事板,其中包含所有 VC 以及它们之间的导航,并且每个 VC 都有一个 containerView,我从其他故事板实例化容器内的 viewController .其他故事板只有 vc 没有导航,只有单独的场景。 (这里的缺点是我需要一个 VC 用于容器设置容器的内容,所以对于每个场景我需要 1 个容器 VC,另一个 VC 实际上是真实的所有 vc 共享的代码)
  3. 具有相同的情节提要并为情节提要中的每个场景创建 5 个 xib,因此我将文件所有者设置为情节提要中的当前 vc,并且我添加了一个子视图,例如:

    view.addSubview(NSBundle.mainBundle().loadNibNamed(“Template1_First_Screen”, owner: self, options: nil).first! as UIView)
    

    这里可能是苹果维护得更少,可能已经过时了?这看起来至少更整洁,因为我只向当前 vc

  4. 添加一个视图

与其为胖 ViewController 创建多个模板,不如尝试排除所有不直接处理视图的内容。
所以它不应该实现数据源,我通常只实现中间委托,即对于 table 视图,另一个 class 获取回调块来填充单元格。

如果这样做,您甚至可以达到根本不需要自定义视图控制器的状态。参见 http://www.objc.io/issue-1/lighter-view-controllers.html, http://chris.eidhof.nl/posts/intentions.html and https://bendyworks.com/single-responsibility-principle-ios/


我写了一个小例子来说明我的想法:https://github.com/vikingosegundo/ViewControllerThemer

  • 它以给定的视图为主题,在本例中仅为背景色。但可以是任何东西

    • 字体
    • 颜色
    • 约束
  • 执行主题的意图使用枚举 select switch 语句中的正确主题。它作为故事板中用户定义的运行时属性传入。在现实世界中,我可能会创建另一个意图来实现主题意图的数据源并为其提供所需的值。

  • 请注意,我在此示例中使用普通的 UIViewController。 Unreal world application 我会使用一个基本控制器 aka ThemeableViewController 来定义所有可用的元素。

  1. 同意你的看法
  2. 如果子视图控制器仅用于显示父视图控制器中的所有内容,则不值得
  3. 这是建议中最方便的选项。它不涉及带有子控制器的无用层,并允许您在单个故事板中保持导航

我会建议选项 4:创建不同的 xib,并且根本不涉及故事板。我相信这通常会导致更简单的应用程序架构并增加更多的灵活性。

只为导航保留故事板似乎很奇怪(如果它是故事板的责任)。

更新

考虑 proposed way 初始化 view 属性 选项 3 似乎并不奇怪。

class ViewController: UIViewController {
    override func loadView() {
        view = NSBundle.mainBundle().loadNibNamed("View", owner: self, options: nil).first! as UIView
    }
} 

关于这种方法的奇怪之处的最初评论是在考虑到这个选项的情况下写的:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(NSBundle.mainBundle().loadNibNamed("View", owner: self, options: nil).first! as UIView)
    }
}