2016-11-03 11 views
-2

私はiOS開発を初めて使いました。 UIViewControllerに、init()またはviewDidLoad()のメソッドを作成するのではなく、注入された依存関係とサービスを注入する必要があります。このように見て何か:iOS開発と迅速プログラミング言語の依存性注入を使用

// Initialize View Controller 
let viewController = ViewController() 

// Configure View Controller 
viewController.requestManager = RequestManager() 

私の質問は以下のとおりです。

  1. は、iOSやない可能ということですか?
  2. 依存関係とUIViewControllerをどこで作成しますか?
  3. どのようにMyUIViewControllerのように見えますか?init()メソッドを使用する必要がありますか?

注1:私はどんな種類の容器も使用しません。私は純粋な人DIを使用する必要があります。

注2:ASP.NET MVCではIControllerFactoryのように見えます。

+1

私はあなたが、「依存性の注入」によって何を意味するのか見当がつかない。しかし、あなたが示したコードは合法であるので、何が問題なのですか? – matt

+0

どこに挿入すればよいですか? –

+0

どこでも好きです。あなたのコードはビューコントローラを作成するので、ビューコントローラを作成するときに行います。 – matt

答えて

2

ビューコントローラに依存関係を注入できるようにするには、UIViewControllerをサブクラス化してカスタムのinit関数を作成する必要があります。

これはSO例として投稿を参照してください:あなたのだろう

init(requestManager: RequestManager) 
{ 
    self.requestManager = requestManager 

    super.init(nibName: nil, bundle: nil) 
} 

、あなたがMyUIViewControllerのインスタンスを作成します、だからあなたのUIViewControllerのサブクラスにカスタムのinitを持つことになり how-do-i-make-a-custom-initializer-for-a-uiviewcontroller

のようなものhave:

let myRequestManager = RequestManager() 
let viewController = MyUIViewController(requestManager: myRequestManager) 
3

UIStoryboardSegueを使用して新しいView Controllerに移行する場合は、依存関係注入などのセットアップは、-prepareForSegue:コールバックで行うことができます。これは、ビューコントローラがストーリーボードからロードされて初期化された後で、ビューがロードされる前に発生します。例:

- (void)prepareForSegue:(UIStoryboardSegue *)segue { 
    MyViewController * vc = (MyViewController *)segue.destinationViewController; 
    vc.injectedProperty1 = [InjectedObject new]; 
    vc.injectedProperty2 = [OtherInjectedObject new]; 
} 
2

BNR帳がファクトリメソッドは言及しなかった理由は、iOSアプリはない(一般的に)行うView Controllerを作成するためにそれらを使用することです。あなたがiOS開発に慣れていなくて、そのルートを下っているなら、おそらくあなたのアプリの構造についてもう一度考えるべきでしょう。

プレゼンテーションビューコントローラーのストーリーボードから始まり、プロパティを割り当てる方が良いでしょう。prepare(for segue: UIStoryboardSegue)例えばもちろん、あなたがinit?(coder aDecoder: NSCoder)を必要と上書きすることができ、が

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let viewController = segue.destination as? MyViewController { 
     viewController.requestManager = requestManager 
    } 
} 

...

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    requestManager = RequestManager() 
}