如何在UITabBarController中使用自定义初始化程序注入依赖项?

时间:2018-11-12 13:44:05

标签: ios swift uikit uitabbarcontroller nib

我有一个没有任何NIB文件的自定义UITabBarController。所有模块的导航控制器都是在具有创建者功能的viewDidLoad方法中创建的。我想通过像以下这样的创建函数添加带有参数的coreDataStack:

override func viewDidLoad() {
super.viewDidLoad()

let aModuleNavCont = aModuleBuilder.createaModule(coreDataStack) as! UINavigationController
...
}

但是在此之前,我必须在自己的UITabBarController类中设置coreDataStack属性。 我已经写了这个初始化文件:

init(coreDataStack: CoreDataStack) {
    self.coreDataStack = coreDataStack
    super.init(nibName: nil, bundle: nil)
}

但是它说:'必需的'初始值设定项'init(coder :)'必须由'UITabBarController'的子类提供。因此,我用Xcode生成了这个初始化项:

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

现在构建成功,并且应用运行良好(看起来不错),但是我预感这不是一个很好的解决方案。

我尝试在所需的init中添加super.init(coder: aDecoder)行,但是它说“属性'self.coreDataStack'不在super.init调用中初始化”。

我已经尝试了好几种方法,但是我不知道该怎么做才能很好地解决这个问题。你能帮忙吗?

在此先感谢您提供的帮助。

1 个答案:

答案 0 :(得分:2)

您对此感到不安是正确的,但是实际上这是正确的,并且是不使用NIB时实现Coder初始化的标准方法。

这种藤壶(感觉粘在系统上的怪异事物)来自可可的高度动态特性和Swift更加严格的初始化要求之间的相互作用。 (Swift添加了这些初始化要求,特别是因为lessons we learned from ObjC ....)