Viper Architecture Routing

How to create good routing in a Viper architecture project? I am starting to create a file for routing, but I do not understand what I should do next.

I create the wireframe of the first controller and the wireframe protocol:

//  ChooseLanguageWireframeProtocol.swift

import UIKit

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

in the file frame I add:

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

    }
}

After creating 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
    }

}

In the AppDelegate file, I only change

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!)
    }

What should I add or change to work properly?

+4
source share
2 answers

2 possibilities:

Change the initialization of the rootViewframe to accept your dependency and initialize it. And btw your variable type should not be a real type, but a protocol, so you can easily mock it with testing

let chooseLanguageScreenWireframe : ChooseLanguageWireframeProtocol?

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

selectLanguageWireframe appdelegate . . , .

2 selectLanguageWireframe appdelegate

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

-, . ( SwiftInject Typhoon)

, , VIPER - .

0

- UINavigationController . , .

, , "solutuon" , .

, , , xibs.

, , , , , MVC.

VIPER, , VIPE: -)

, , UDPiewController defattening.

, , , , .

+1

Source: https://habr.com/ru/post/1674728/


All Articles