私はいくつかの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 )
それらをいくつかのView Controllerに挿入すると、次のようになります。
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
ように 2 つの異なる方法で表示されます。
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?
失敗した 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 ストーリーボードに既に配置されています。