2

我开始Swinject在我的应用程序中使用,我想在presenters(Viper/MVP) 或viewControllers(Not Viper) 之间共享我的 rootNavigator 实例。我遇到的主要问题是我想共享appRootNavigatorpresenters但我失去了 的实例,window因为当我注册一个新模块时swinject会生成该类的新实例 ( AppRootNavigator)。我如何AppRootNavigatorpresenters.

在这部分代码中,我尝试更改 的navigatorpresenter但它从未进入 if。

if let presenter = container.resolve(SignupPresenter.self, argument: self){
     signUpController.presenter = presenter
}

我不知道另一种方法可以做到这一点。

这是rootNavigator

import Foundation
import UIKit
import Swinject

class AppRootNavigator: RootNavigator {

    internal let container: Container
    fileprivate var window: UIWindow?

    init(container: Container) {
        self.container = container
    }

    fileprivate lazy var storyboards: Storyboard = {
        return Storyboard(container: self.container)
    }()

    func installRootViewController(in window:UIWindow) {
        self.window = window
        currentNavigationController = signupController()
        self.window?.rootViewController = currentNavigationController
    }

    fileprivate func signupController() -> UINavigationController {
        let signUpController  =  storyboards.signup.instantiateInitialViewController() as! SignupController

        if let presenter = container.resolve(SignupPresenter.self, argument: self) {
            signUpController.presenter = presenter
        }
        return UINavigationController.init(rootViewController: signUpController)
    }

在这里我注册了我想要使用的所有元素。

import Swinject
import Alamofire
import RealmSwift

struct SignupContainer: Bundle {
    func create(_ container: Container) {

        container.register(SignupNavigator.self) { c in
            AppRootNavigator.init(container: container) as SignupNavigator
        }

        container.register(SignupInteractor.self) { c in
            SignupInteractorImpl(facebook: c.resolve(FacebookService.self)!,
                                 api: c.resolve(API.self)!,
                                 realm: c.resolve(Realm.self)!,
                                 analytics: c.resolve(Tracker.self)!)
        }

        container.register(SignupPresenter.self) { c, navigator in
            SignupPresenterImpl(navigator: navigator, interactor:c.resolve(SignupInteractor.self)!) as SignupPresenter
        }

        container.registerForStoryboard(SignupController.self) {
            c, controller in
            if var presenter = c.resolve(SignupPresenter.self, argument: c.resolve(SignupNavigator.self)!) {
                controller.presenter  = presenter
                presenter.view        = controller
            }
        }
4

1 回答 1

4

navigator要进行工作更改presenter,您需要显式指定参数类型:

if let presenter = container.resolve(SignupPresenter.self, argument: self as SignupNavigator) {
    signUpController.presenter = presenter
}

但是,您不需要这样做。您只需要SignupNavigator.container对象范围内注册:

container.register(SignupNavigator.self) { c in                   
    AppRootNavigator.init(container: container) as SignupNavigator
}.inObjectScope(.container)
于 2018-02-14T10:01:14.657 回答