【发布时间】:2018-07-08 03:35:35
【问题描述】:
我正在关注 John Sundell 的帖子以实现导航器模式 (https://www.swiftbysundell.com/posts/navigation-in-swift)。基本思想是,与协调器模式相比,每个视图控制器都可以简单地调用navigator.navigate(to: .someScreen),而不必知道其他视图控制器。
我的问题是,因为为了构建视图控制器我需要一个导航器,所以要构建一个导航器我需要一个导航控制器,但我想让视图控制器成为导航控制器的根,什么是最好的方法以尊重依赖注入最佳实践的方式解决这种循环依赖?
下面是 Sundell 说明的导航器模式的想法
导航器
protocol Navigator {
associatedtype Destination
func navigate(to destination: Destination)
}
class LoginNavigator: Navigator {
enum Destination {
case loginCompleted(user: User)
case signup
}
private weak var navigationController: UINavigationController?
private let viewControllerFactory: LoginViewControllerFactory
init(navigationController: UINavigationController,
viewControllerFactory: LoginViewControllerFactory) {
self.navigationController = navigationController
self.viewControllerFactory = viewControllerFactory
}
func navigate(to destination: Destination) {
let viewController = makeViewController(for: destination)
navigationController?.pushViewController(viewController, animated: true)
}
private func makeViewController(for destination: Destination) -> UIViewController {
switch destination {
case .loginCompleted(let user):
return viewControllerFactory.makeWelcomeViewController(forUser: user)
case .signup:
return viewControllerFactory.makeSignUpViewController()
}
}
}
视图控制器
class LoginViewController: UIViewController {
private let navigator: LoginNavigator
init(navigator: LoginNavigator) {
self.navigator = navigator
super.init(nibName: nil, bundle: nil)
}
private func handleLoginButtonTap() {
navigator.navigate(to: .loginCompleted(user: user))
}
private func handleSignUpButtonTap() {
navigator.navigate(to: .signup)
}
}
现在在AppDelegate 我想做类似的事情
let factory = LoginViewControllerFactory()
let loginViewController = factory.makeLoginViewController()
let rootNavigationController = UINavigationController(rootViewController: loginViewController)
window?.rootViewController = rootNavigationController
但我必须以某种方式将rootNavigationController 传递到factory 才能正确构造loginViewController 对吗?因为它需要一个导航器,它需要导航控制器。该怎么做?
【问题讨论】:
标签: swift dependency-injection factory circular-dependency