我正在注册一些Swinject
singleton-with-a-small-s(.container)服务:
defaultContainer.register( SomeService.self )
{
_ in SomeService()
}.inObjectScope( .container )
defaultContainer.register( AnotherService.self )
{
responder in AnotherService(
someService: responder.resolve( SomeService.self )!
)
}.inObjectScope( .container )
将它们注入某些视图控制器中:
defaultContainer.registerForStoryboard( SomeViewController.self )
{
resolvable, viewController in
viewController.someService = resolvable.resolve( SomeService.self )
viewController.anotherService = resolvable.resolve( AnotherService.self )!
}
defaultContainer.registerForStoryboard( AnotherViewController.self )
{
resolvable, viewController in
viewController.someService = resolvable.resolve( SomeService.self )
viewController.anotherService = resolvable.resolve( AnotherService.self )!
}
然后以两种不同的方式显示这些视图控制器,SomeViewController
,如下所示:
DispatchQueue.main.async
{
self.performSegue( withIdentifier: "somePageSegue", sender: nil )
}
AnotherViewController
就像这样:
let anotherViewController = UIStoryboard(
name: "Main"
, bundle: nil
).instantiateViewController( withIdentifier: "anotherSegue" )
present( anotherViewController, animated: true, completion: nil )
SomeViewController
会注入其服务,但不幸的是AnotherViewController
没有。
这曾经在Swinject
升级到Swift 3.0之前工作,但现在不行。为什么会这样,需要改变什么呢?
谢谢。
更新
我既不熟悉Swinject
的基础代码库,也不熟悉我自己熟悉的时间,而是挖掘表面下发生的事情,我发现了以下内容,希望对此有用任何可能比我更了解它的人:
成功的VC DI:
// once into:
private func injectDependency(to viewController: UIViewController)
// then:
defaultContainer.registerForStoryboard( SomeViewController.self )
// then many times into:
public func _resolve<Service, Factory>(name: String?, option: ServiceKeyOptionType? = nil, invoker: (Factory) -> Service) -> Service?
FAILED VC DI:
// repeatedly going from:
private func injectDependency(to viewController: UIViewController)
// to:
public func _resolve<Service, Factory>(name: String?, option: ServiceKeyOptionType? = nil, invoker: (Factory) -> Service) -> Service?
// and back again,
// then twice into:
public override func instantiateViewController(withIdentifier identifier: String) -> UIViewController
其他说明:
失败的VC是TabBarController中的UIViewController,两者都已经在标准的XCode故事板中布局。
答案 0 :(得分:1)
为了调用registerForStoryboard
,您需要从SwinjectStoryboard
实例化给定的控制器,而不仅仅是UIStoryboard
:
let anotherViewController = SwinjectStoryboard.create(name: "Main", bundle: nil)
.instantiateViewController(withIdentifier: "anotherSegue")
present(anotherViewController, animated: true, completion: nil)
答案 1 :(得分:1)
事实证明这是一个错误,详见:https://github.com/Swinject/Swinject/issues/177。目前正在修复一个修复程序。一旦我了解更多,我会报告。
<强>更新强>
这显然是固定的。