我一直在寻找一个优雅的解决方案一段时间没有幸福。
我想:
这就像打击Apple框架一样;视图控制器位于导航流的驱动器位置。我正在考虑改变它并在代码中进行整体导航,但问题是要创建哪种对象拥有视图控制器,何时进行实例化。活动指标将出现在源场景中。
答案 0 :(得分:0)
不要放弃与Apple MVC框架的斗争!
使用此Xcode插件(https://github.com/natangr/ViperTemplate)自动创建和启动VIPER文件。
阅读这篇文章,了解有关VIPER实例化的更多高级技巧(以及上述插件的说明):https://www.ckl.io/blog/best-practices-viper-architecture/
在自己的路由器上模块初始化代码将消除大量代码重复,特别是对于大型项目。 您需要创建一次这些扩展程序:
// ReusableView.swift
protocol ReusableView: class {}
extension ReusableView {
static var reuseIdentifier: String {
return String(describing: self)
}
}
// UIViewController.swift
extension UIViewController: ReusableView { }
// UIStoryboard.swift
extension UIStoryboard {
func instantiateViewController() -> T where T: ReusableView {
return instantiateViewController(withIdentifier: T.reuseIdentifier) as! T
}
}
然后,在每个VIPER模块的路由器上保留初始化代码:
// MainSearchRouter.swift
class MainSearchRouter {
// MARK: Properties
weak var view: UIViewController?
// MARK: Static methods
static func setupModule() -> MainSearchViewController {
let viewController = UIStoryboard(name: MainSearchViewController.storyboardName, bundle: nil).instantiateViewController() as MainSearchViewController
let presenter = MainSearchPresenter()
let router = MainSearchRouter()
let interactor = MainSearchInteractor()
viewController.presenter = presenter
presenter.view = viewController
presenter.router = router
presenter.interactor = interactor
router.view = viewController
interactor.output = presenter
return viewController
}
}
这可能看起来像很多步骤,但好消息:前面提到的插件也会自动化!