gpt4 book ai didi

swift - 使用 Storyboard 和自定义 View Controller init

转载 作者:可可西里 更新时间:2023-11-01 01:08:30 29 4
gpt4 key购买 nike

当以编程方式推送 View Controller 时,可以通过 init 方法轻松地进行一些依赖注入(inject):

let dummyVC = DummyVC(dummyManager: DummyManager())
self.pushViewController(dummyVC, animated: true)

使用目标 Controller :

class DummyVC: UIViewController {
private let dummyManager: DummyManager

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

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

使用 Storyboards 时,我们无法选择调用的 init 方法(正在调用自定义 init 方法)。

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

有没有办法以相同的方式注入(inject)依赖项,同时保持属性私有(private)和常量 (let)?

最佳答案

Storyboard中的 View Controller 始终使用

进行初始化
init?(coder aDecoder: NSCoder)

没有办法解决这个问题。

另一种方法是……

class DummyVC: UIViewController {
private var dummyManager: DummyManager!

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

然后……

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let dummyVC = mainStoryboard.instantiateViewControllerWithIdentifier("DummyVC") as! DummyVC
dummyVC.configure(dummyManager: DummyManager())

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 函数。

关于swift - 使用 Storyboard 和自定义 View Controller init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51988061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com