从情节提要中实例化专门的 ViewController

Posted

技术标签:

【中文标题】从情节提要中实例化专门的 ViewController【英文标题】:Specialized ViewConrtoller instantiation from storyobard 【发布时间】: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

【问题讨论】:

【参考方案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()

    

【讨论】:

谢谢,我找到了使用虚拟控制器的相同解决方案。我用链接编辑了我的帖子。

以上是关于从情节提要中实例化专门的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11:无法从带有标识符的情节提要中实例化视图控制器

从情节提要“Main”中实例化具有标识符“UIViewController-ZWG-5q-24I”的视图控制器,但没有获得 UITableView。

如何使用给定的根视图控制器和初始视图控制器实例化情节提要?

如何在没有情节提要的情况下以编程方式实例化视图控制器

如何从应用程序委托、情节提要、iOS6 获取我的视图控制器的实例

如何在情节提要中的 2 个视图控制器之间传递数据?