2017-04-13 7 views
4

Viperアーキテクチャでプロジェクトのルーティングを正しく作成するにはどうすればよいですか?私はルーティングのためのファイルを作成し始めますが、私は次に何をしなければならないのか分かりません。ルーティングViperのアーキテクチャ

Iファイルワイヤフレーム、第1のコントローラとワイヤフレームプロトコルの作成:私は

// ChooseLanguageWireframe.swift 

import UIKit 

class ChooseLanguageWireframe: NSObject , ChooseLanguageWireframeProtocol{ 

    var chooseLanguageScreenViewController: ChooseLanguageViewController? 
    var window: UIWindow? 

    func presentChooseLanguageViewControllerWindow() { 
     let chooseLanguageViewController = UIStoryboard.init(name: "ChooseLanguage", bundle: nil).instantiateViewController(withIdentifier: "ChooseLanguage") as? ChooseLanguageViewController 
     self.chooseLanguageScreenViewController = chooseLanguageViewController 
     self.window!.rootViewController = chooseLanguageScreenViewController 
     self.window!.makeKeyAndVisible() 
    } 
    func presentAuthScreenViewController() { 

    } 
} 

iはファイルAppDelegateでRootWireframe

// RootWireframe.swift 

import UIKit 

class RootWireframe: NSObject { 

    let chooseLanguageScreenWireframe : ChooseLanguageWireframe? 

    override init() { 
    //What i must init?? 
    } 

    func application(didFinishLaunchingWithOptions launchOptions: [AnyHashable: Any]?, window: UIWindow) -> Bool { 
     self.chooseLanguageScreenWireframe?.window = window 
     return true 
    } 

} 

を作成した後:私は追加ファイルワイヤーフレームで

// ChooseLanguageWireframeProtocol.swift 

import UIKit 

@objc protocol ChooseLanguageWireframeProtocol { 
    func presentChooseLanguageViewControllerWindow() 
    func presentAuthScreenViewController() 
} 

を変更のみ

var window: UIWindow? 
    let rootWireframe = RootWireframe() 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     self.rootWireframe.application(didFinishLaunchingWithOptions: launchOptions as [NSObject : AnyObject]?, window: self.window!) 
    } 

正しく動作させるために追加または変更する必要があるものはありますか?

+1

実際には、依存関係の作成と注入が欠落しています。 Viperとその他のデカップリングされたアーキテクチャはすべて、依存性注入とコントロールの発明に基づいています。 –

答えて

0

2の可能性:

変更あなたのrootViewframeのinitはあなたの依存関係を受け入れ、それを初期化します。あなたがテスト

let chooseLanguageScreenWireframe : ChooseLanguageWireframeProtocol? 

override init(chooseLanguage: ChooseLanguageWireframeProtocol) { 
self.chooseLanguageScreenWireframe = chooseLanguage 
} 

で簡単にモックそしてappdelegateであなたのchooseLanguageWireframeの実装を作成し、コンストラクタで渡すことができますので、 そして、ところで、あなたの変数の型は、実数型が、プロトコルではありません。 これにより、依存関係が明確になり、表示されます。あなたは常にそれを初期化するので、オプション性を削除することもできます。

または溶液2

がappdelegateでchooseLanguageWireframeを作成し、いずれの場合も、コンストラクタ

lazy var rootWireframe = { 
let r = RootWireframe() 
r.chooseLanguageScreenWireframe = self.chooseLanguageScreenWireframe 
return r 
} 

外であり、それを注入し、あなたがどこかに自分の依存関係をインスタンス化する必要があり、彼らが自動的に作成されますすることはできません。 あなたは通常、また、工場とし​​、依存性注入フレームワークの助けを借りて(SwiftInjectや台風を確認してください)

プロトコルタイプで、すべての依存関係を宣言することを行い、テストを簡素化するためにVIPERアーキテクチャの目的であるとしてモックアクター間の隔離

1

UINavigationControllerを継承し、そこにルーティングロジックを行う方法があります。タスクに応じて、アプリケーションのさまざまな部分で複数のクラスをルーティングすることになります。

しかし、どのような流行語でも、「solutuon」が作成するよりも多くの問題を解決する場合は、最初に自分自身に質問する必要があります。

には、平らな古いxibsに というストーリーボードを追加することで、これまでに解決されたのと同じ問題が2つのダースの画面に表示されます。

だから、本当にほとんどより読みやすい標準MVCプロジェクトよりもできなくなります迷路を、あなたが本当に にプロセス内のクラスのとてもたくさんの作成このcromulentアーキテクチャをフォローしたい場合は、バックステップと自問する必要があり 。

あなたは、ストーリーボードを使用し、VIPERを使用することができない場合は、ストーリーボードを使用することができる場合 、そう

:-) VIPEを行うしかし、ほとんどのプロジェクトでデータモデルはとても哀れ簡単で、 プレゼンテーションが非常に緊密ですUIViewController defatteningの必要性がゼロになりました。

そして私は、ほとんどのバイパーアタシェードによって適用された治療法は、死体そのものよりも悪いと考えています。

+1

Cocoa MVCは非常に結合しています。バイパーのようなフレームワークを使用してビジネスロジックなどをテストする方法はありません。あなたと将来のすべての開発者にとって、プロジェクトのテストと保守性を可能にします。小規模なプロジェクトであっても、それを適用すると良いかもしれません。なぜなら、プロジェクトの大きさを決して知ることができず、別の大きなプロジェクトに役立つようなことを教えているからです。アーキテクチャーはコード化した方法よりも考え方です –

関連する問題