iOS 上的自定义模板系统

Posted

技术标签:

【中文标题】iOS 上的自定义模板系统【英文标题】:Custom System of templates on iOS 【发布时间】:2015-03-04 13:49:56 【问题描述】:

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

我能想到一些不同的方法:

    5 个不同的故事板在每个故事板中重复相同的导航。由于应用程序可能/将会更改,因此我放弃了此选项,因为我必须在 5 个故事板中重做我在导航中所做的每次更改。 有一个包含所有 VC 和它们之间的导航的故事板,并且每个 VC 都有一个 containerView,我从其他 Storyboard 实例化容器内的 viewController。其他故事板只有没有导航的 vcs,只是单独的场景。 (这里的缺点是我需要一个用于设置容器内容的容器的 VC,所以对于每个场景我需要 1 个 containerVC,以及另一个实际上是所有 vc 共享的真实代码的 VC)

    拥有相同的情节提要并为情节提要中的每个场景创建 5 个 xib,因此将文件所有者设置为情节提要中的当前 vc,并添加一个子视图,例如:

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

    这里的问题可能是它们很少被苹果维护并且可能已经过时了?这看起来至少更整洁,因为我只是在当前的 vc 中添加一个视图

【问题讨论】:

你们的模板有什么区别?他们有不同的布局吗?或者它更像是皮肤——只有字体/颜色/背景变化? 它们有不同的布局,但它们都共享相同的视图(所以动作、出口......) 【参考方案1】:
    同意你的意见 子视图控制器如果仅用于显示父视图控制器中的所有内容,则不值得 这是建议中最方便的选项。它不涉及带有子控制器的无用层,并允许您在单个故事板中保持导航

我建议选项 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)
    
 

【讨论】:

太棒了!我想我会去第三个。也许它并不完全相关,但是将 xib 视图加载到从情节提要创建的 vc 中,这是正确的方法吗?添加一个覆盖loadView的孩子? gist.github.com/ivangodfather/ec13b309afc009930320 @user588125, loadView 绝对是为视图控制器提供视图的最佳位置【参考方案2】:

不要为胖 ViewController 创建多个模板,而应该尝试将不直接处理视图的所有内容分解出来。 所以它不应该实现数据源,我通常只实现中间委托,即表视图,以另一个类获取回调块来填充单元格的方式。

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


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

它为给定的视图设置主题,在这种情况下只有背景颜色。但可以是任何东西

字体 颜色 约束 …

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

请注意,我在此示例中使用普通的 UIViewController。虚幻世界的应用程序我会创建一个基本控制器,也就是 ThemeableViewController,它定义了所有可用的元素。

【讨论】:

@vikingosegndo,看我的评论,所有的模板都是不同的布局和相同的动作/出口,所以对我来说你的链接没有任何意义 不错。就像您这样做一样,您可以轻松地在 IB 中复制和粘贴内容。 也可以使用意图来布局您的视图控制器。

以上是关于iOS 上的自定义模板系统的主要内容,如果未能解决你的问题,请参考以下文章

为什么iOS 8上的SceneKit无法编译我的自定义着色器?

关于权限系统的自定义标签

Rails:电子邮件“deliver_”方法的自定义模板?

使用Essential Grid的自定义模板

向 % if % 块中的自定义模板标签提供参数的语法

模板中的自定义表单验证错误