1

私はいくつかのSwinjectsingleton-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 ストーリーボードに既に配置されています。

4

2 に答える 2

1

を呼び出すには、 だけでなく、registerForStoryboardから特定のコントローラーをインスタンス化する必要があります。SwinjectStoryboardUIStoryboard

let anotherViewController = SwinjectStoryboard.create(name: "Main", bundle: nil)
    .instantiateViewController(withIdentifier: "anotherSegue")

present(anotherViewController, animated: true, completion: nil)
于 2016-10-15T08:35:19.110 に答える
1

これはバグであることが判明しました。詳しくはhttps://github.com/Swinject/Swinject/issues/177をご覧ください。現在、修正に取り組んでいます。詳しく分かり次第また報告します。

アップデート

これは明らかに修正されています。

于 2016-10-19T08:21:29.130 に答える