重用情节提要ViewController-父/子ViewController

时间:2019-02-19 12:29:45

标签: swift uiviewcontroller superclass

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

我想创建一个弹出的ViewController,可以对多个子类进行调整,这些子类都共享相同的基本布局(从基类继承)。我希望在故事板场景中定义基类的布局,以尝试遵循苹果的指南(不使用xib)。这还包括在接口构建器中而不是在代码中设置所有约束。

我只想做正确的事:)

我的问题是,如果我开始对ParentViewController(在Storyboard中具有关联的场景)进行子类化,则该应用程序将不允许我显示ViewController。如果通过情节提要ID实例化,则无法将其强制转换为子类。如果我通过创建子类ViewController的实例进行实例化,则不会显示,因为故事板文件中的UI已“锁定”到ParentViewController。

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

感谢您的帮助或评论!

1 个答案:

答案 0 :(得分:0)

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

当您具有类似的viewcontroller且有少量更改时。您必须创建不同的ViewController。使用此方法,您可以在带有故事板的基本Viewcontroller上创建并重新使用该viewcontroller。

 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)