首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用故事板和自定义View Controller初始化

使用故事板和自定义View Controller初始化
EN

Stack Overflow用户
提问于 2018-08-23 22:22:45
回答 1查看 263关注 0票数 3

当以编程方式推送视图控制器时,可以很容易地通过init方法进行一些依赖注入:

代码语言:javascript
复制
let dummyVC = DummyVC(dummyManager: DummyManager())
self.pushViewController(dummyVC, animated: true)

使用目标控制器:

代码语言:javascript
复制
class DummyVC: UIViewController {
    private let dummyManager: DummyManager

    init(dummyManager: DummyManager) {
        self.dummyManager = dummyManager
        super.init(nibName: nil, bundle: nil)
    }
}

前面的代码很好,因为它正确地封装了属性,并清楚地显示了对外部API的依赖关系。

当使用故事板时,我们不能选择被调用的init方法(正在调用一个自定义的init方法)。

代码语言:javascript
复制
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let dummyVC = mainStoryboard.instantiateViewControllerWithIdentifier("DummyVC") as! DummyVC
dummyVC.dummyManager = DummyManager() // ERROR: would require dummyManager to have public scope

有没有办法在保持属性私有和常量(let)的同时以同样的方式注入依赖关系?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 22:31:34

序列图像板中的视图控制器始终使用

代码语言:javascript
复制
init?(coder aDecoder: NSCoder)

这是没有办法的。

另一种方法是使用…

代码语言:javascript
复制
class DummyVC: UIViewController {
    private var dummyManager: DummyManager!

    func configure(dummyManager: DummyManager) {
        self.dummyManager = dummyManager
    }
}

然后是…

代码语言:javascript
复制
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let dummyVC = mainStoryboard.instantiateViewControllerWithIdentifier("DummyVC") as! DummyVC
dummyVC.configure(dummyManager: DummyManager())

代码语言:javascript
复制
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    switch segue.destination {
    case let dummyVC as DummyVC:
        dummyVC.configure(dummyManager: DummyManager())
    default: 
        break
    }
}

虽然不完美(使用let而不是var),属性为private和隐式展开的可选意味着必须设置它(否则应用程序在使用时会崩溃),而这只能在包含类的内部发生。

我已经在我的应用程序中采用了这个方法,并且发现它是确保所有属性都被设置的一个很好的方法。只要记住当一个属性被添加到一个类中时更新configure函数即可。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51988061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档