【问题标题】:Specialized ViewConrtoller instantiation from storyobard从情节提要中实例化专门的 ViewController
【发布时间】:2020-03-09 17:09:17
【问题描述】:

我有一个这样的 ViewModel 专用 ViewController:

final class MyViewConrtoller<MyViewModel>: UIViewController {
    var viewModel: MyViewModel?

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

我在 InterfaceBuilder 中设置了 ViewController 的类型。 然后我尝试如下实例化它:

guard let myViewController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "MyViewController") as? MyViewController<MyViewModel> else { return }

而且看起来演员阵容失败了。确实创建了一个实例(在强制转换之前),但是当它尝试强制转换时,会返回一个 nil。

我有什么遗漏的吗?

编辑:

进一步看,我发现了一个有趣的解决方案,我将尝试。以下是可能需要的人的链接:

Link Storyboard to UIViewController with Generic

【问题讨论】:

    标签: swift generics storyboard interface-builder


    【解决方案1】:

    如果您创建一个如下所示的基类并在 Storyboard 中使用子类会怎么样。

    class MyBaseViewController<MyViewModel> : UIViewController {
        var viewModel: MyViewModel?
    }
    
    final class MyViewConrtoller: MyBaseViewController<MyViewModel> {
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    

    现在像这样使用它:

     private func LoadMyViewContrller() {
            guard let myViewController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "MyViewController") as? MyViewConrtoller else { return }
    
            myViewController.viewModel = yourViewModel
            myViewController.loadView()
    
        }
    

    【讨论】:

    • 谢谢,我找到了使用虚拟控制器的相同解决方案。我用链接编辑了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2017-08-03
    • 1970-01-01
    • 2015-12-29
    • 2020-06-02
    相关资源
    最近更新 更多