2016-06-11 13 views
4

Swinjectプロジェクトのresolveメソッドに引数を渡そうとしているテストプロジェクトがあります。Swinjectを使用する場合、resolveメソッドに引数を渡すにはどうすればよいですか?

私のSwinjectストーリーボードエクステンションファイルには、その例があります。

私はGetMessageAction

@IBOutlet weak var myText: UILabel! 

    var dm:MainDM! 
    var container:Container! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: #selector(ViewController.getMessage), userInfo: nil, repeats: false) 

    } 

    func getMessage() { 

     let action:GetMessageAction? = container.resolve(GetMessageAction.self, argument: self)! 
     action?.execute() 

    } 

を解決するには、次のやろうとしている私のViewControllerで

import Swinject 

extension SwinjectStoryboard { 

    class func setup() { 

     let mainDm = MainDM() 

     defaultContainer.register(MainDM.self) { _ in 
      mainDm 
     } 

     defaultContainer.registerForStoryboard(ViewController.self) { r, c in 
      c.dm = r.resolve(MainDM.self) 
      c.container = defaultContainer 

     } 


     defaultContainer.register(GetMessageAction.self) { _, delegate in 
      GetMessageAction(dm:mainDm, delegate: delegate) 
     } 

    } 

} 

私のgetMessage関数が

fatal error: unexpectedly found nil while unwrapping an Optional value

答えて

0

使用のいずれかを実行したとき、私は、次のメッセージが表示されますストーリーボードのメソッドに続いて、registerForStoryboardによって登録されたビューコントローラを取得する。

  • instantiateViewControllerWithIdentifier
  • instantiateInitialViewController

https://github.com/Swinject/Swinject/blob/v1/Documentation/Storyboard.md https://github.com/Swinject/SwinjectStoryboard/issues/5

+0

これは解決策(GetMessageAction.self、引数:自己)に引数を渡せない理由を説明していません – mattwallace

+0

私の誤解をおかけして申し訳ありません。あなたの質問を慎重に読む時間がなかった。 –

+0

'InstantContentControllerWithIdentifier'や' instantiateInitialViewController'ではなく、 'ViewController'をイニシャライザでインスタンス化したと思います。そのため、 'ViewController'の' container'プロパティが注入されず、エラーが発生しました。 'instantiate *'メソッドのどちらかを使用する場合、 'container'プロパティが注入されていて' nil'ではないので、 'GetMessageAction'の' resolve'メソッドが引数で動作するはずです。 –

2

の引数で解決することは引数の正確一致の種類に依存している、あなたが渡されたオブジェクトをダウンキャストする必要があるとして:

container.resolve(GetMessageAction.self, argument: self as GetMessageActionDelegate)! 

GetMessageActionDelegateがコンストラクタGetMessageAction(dm:delegate:)で渡されたデリゲートの型であると仮定します。

+0

これを行うと、私はまだ次のエラーが発生します 致命的なエラー: – mattwallace

1

は、init(NSCoder)を宣言しなければなりません、あなたのストーリーボードで作成したのViewControllerの迅速なファイルは、それが実際にREADME.mdで言及されていない、私は...

このに関する問題を開くことを考えています
required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

あなたは私のopen source project using exactly this techniqueを見てとることができ、私はextension of SwinjectStoryboard hereLoadingDataVCのため使用して依存関係を設定しています。

extension SwinjectStoryboard { 
    class func setup() { 

     defaultContainer.register(HTTPClientProtocol.self) { _ in 
      HTTPClient() 
     }.inObjectScope(.Container) 

     defaultContainer.register(APIClientProtocol.self) { r in 
      APIClient(
       httpClient: r.resolve(HTTPClientProtocol.self)! 
      ) 
     }.inObjectScope(.Container) 

     defaultContainer.register(ImagePrefetcherProtocol.self) { _ in 
      ImagePrefetcher() 
     }.inObjectScope(.Container) 

     defaultContainer.registerForStoryboard(GameVC.self) { r, c in 
      c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self) 
     } 

     defaultContainer.registerForStoryboard(LoadingDataVC.self) { r, c in 
      c.apiClient = r.resolve(APIClientProtocol.self) 
      c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self) 
     } 
    } 
} 

必要なinitを取得したら、それが機能するはずです。 :)

関連する問題