一段时间以来,我一直在寻找一个优雅的解决方案,但并不快乐。
我想要:
- 解决 VIPER、MVVM 等人解决的大规模视图控制器问题,
- 始终在完全渲染的屏幕之间设置动画过渡。
这感觉就像与 Apple 框架作斗争;视图控制器位于导航流程的驾驶座上。我正在考虑扭转这种情况并在代码中进行整体导航,但问题是要创建什么样的对象来拥有视图控制器,以及何时实例化。活动指示器将在源场景上。
一段时间以来,我一直在寻找一个优雅的解决方案,但并不快乐。
我想要:
这感觉就像与 Apple 框架作斗争;视图控制器位于导航流程的驾驶座上。我正在考虑扭转这种情况并在代码中进行整体导航,但问题是要创建什么样的对象来拥有视图控制器,以及何时实例化。活动指示器将在源场景上。
不要放弃对抗 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
}
}
这可能看起来有很多步骤,但好消息是:前面提到的插件也可以自动完成!