1

一段时间以来,我一直在寻找一个优雅的解决方案,但并不快乐。

我想要:

  • 解决 VIPER、MVVM 等人解决的大规模视图控制器问题,
  • 始终在完全渲染的屏幕之间设置动画过渡。

这感觉就像与 Apple 框架作斗争;视图控制器位于导航流程的驾驶座上。我正在考虑扭转这种情况并在代码中进行整体导航,但问题是要创建什么样的对象来拥有视图控制器,以及何时实例化。活动指示器将在源场景上。

4

1 回答 1

0

不要放弃对抗 Apple MVC 框架!

模块初始化代码放在自己的路由器上将消除一堆代码重复,特别是对于大型项目。您需要创建一次这些扩展:

// 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
    }
}

这可能看起来有很多步骤,但好消息是:前面提到的插件也可以自动完成!

于 2017-04-11T02:29:22.173 回答