2017-04-13 25 views
4

如何在Viper體系結構的項目中創建良好的路由?我開始創建路由文件,但我不明白我必須接下來做什麼。路由Vi蛇體系結構

我創建一個文件線框第一控制器和線框協議:

// ChooseLanguageWireframeProtocol.swift 

import UIKit 

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

在文件線框我添加:

// 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() { 

    } 
} 

我創建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 
    } 

} 

之後在文件AppDelegate中我只更改

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。

所以,你真的要退後一步,問問自己,如果你真的想跟着 這個cromulent架構創造很多很多的課的過程中, 迷宮,這將是很難比標準MVC項目更具可讀性。

如果您不能使用故事板,並希望使用VIPER這樣做, 如果你可以用故事板做VIPE :-)

但在大多數項目的數據模型是如此可憐簡單, 表現是如此緊密地再加上你需要在 UIViewController defatting。

而且我懷疑大多數v蛇藥劑所應用的治療方法比死亡方法本身更差。

+1

Cocoa MVC非常耦合。沒有辦法測試您的業務邏輯等,使用像viper這樣的框架可以爲您和所有未來的開發人員測試和維護項目。即使對於小項目也可以很好地應用它,因爲你永遠不知道項目能夠成爲多大,並教你如何做一些對另一個更大項目有用的方法。架構比您編寫代碼的方式更符合心態 –