アプリで使用し始めており、 (Viper/MVP) または(Viper ではない)Swinject
の間で rootNavigator のインスタンスを共有したいと考えています。私が抱えている主な問題は、 で共有したいということですが、新しいモジュールを登録すると、そのクラス ( ) の新しいインスタンスが生成されるため、 のインスタンスが失われます。間で共有するにはどうすればよいですか。presenters
viewControllers
appRootNavigator
presenters
window
swinject
AppRootNavigator
AppRootNavigator
presenters
コードのこの部分では、 の を変更しようとしnavigator
ましpresenter
たが、 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
}
}