【问题标题】:Reuse Storyboard ViewController - Parent / Child Viewcontroller重用 Storyboard ViewController - 父/子视图控制器
【发布时间】:2019-07-12 23:10:48
【问题描述】:

我想创建一个可以在整个项目中重复使用的 ViewController 基类。

我想创建一个弹出式 ViewController,我可以使用多个共享相同基本布局(从基类继承)的子类进行调整。我希望在情节提要场景中定义基类的布局,以尝试遵循苹果的指导方针(不使用 xib)。这还包括在界面生成器中设置所有约束,而不是在代码中。

我只想做正确的事:)

我的问题是,如果我开始子类化我的 ParentViewController(在 Storyboard 中有关联的场景),应用程序不会让我显示 ViewController。如果我通过 Storyboard ID 实例化,我无法将其转换为我的子类。如果我通过创建子类 ViewController 的实例来实例化,它不会显示,因为情节提要文件中的 UI 被“锁定”到 ParentViewController。

如何在情节提要文件中制作具有关联场景的基本 ViewController,我可以使用各种子类(或类似)。 具体来说:我想制作一个弹出窗口,根据使用情况可能会略有不同。我不想为每个变体创建 init 方法,因为这会破坏尝试拆分代码的目的。

感谢您的帮助或评论!

【问题讨论】:

标签: swift uiviewcontroller superclass


【解决方案1】:

object_setClass(设置对象的类。)将使用 BViewController 类覆盖 AViewController 的实例。因此,您可以在 AViewController 之上添加更多方法。

当您有类似的视图控制器并进行了小的更改时。您必须创建不同的视图控制器。使用此方法,您可以在带有情节提要的基本视图控制器上创建并重用该视图控制器。

 class BViewController{
       static func vcInstanceFromStoryboard() ->BViewController? {
            let storyboard = UIStoryboard(name: "AViewController"), bundle: UIBundle.main)
            let instance = storyboard.instantiateInitialViewController() as? AViewController
            object_setClass(instance, BViewController.self) // 
            return (instance as? BViewController)!
        }
    .....
    } 

This is an example of how do we use it:
let vc = BViewController.vcInstanceFromStoryboard()
self.present(vc , animation : true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多