清洁Swift - 没有segues的路由

Saz*_*han 3 architecture design-patterns ios swift

我发现RouterClean Swift架构中负责导航和传递数据.view controllers.一些样本和文章描述了Routers使用segue传递和与视图控制器通信.什么是便利性设计时,我不希望使用任何SEGUE Storyboard.在Clean Swift中是否可以在没有segue的情况下传递数据?如果您用最简单的完整示例进行描述,我将不胜感激.

pac*_*ion 6

文章说你可以:

// 2.以编程方式呈现另一个视图控制器

您可以使用它来手动创建,配置和推送viewController.

例.

让我们假装你有ViewController按钮(手柄推):

final class ViewController: UIViewController {

    private var router: ViewControllerRouterInput!

    override func viewDidLoad() {
        super.viewDidLoad()

        router = ViewControllerRouter(viewController: self)
    }

    @IBAction func pushController(_ sender: UIButton) {
        router.navigateToPushedViewController(value: 1)
    }

}
Run Code Online (Sandbox Code Playgroud)

ViewControllerrouter实现ViewControllerRouterInput协议.

protocol ViewControllerRouterInput {
    func navigateToPushedViewController(value: Int)
}

final class ViewControllerRouter: ViewControllerRouterInput {

    weak var viewController: ViewController?

    init(viewController: ViewController) {
        self.viewController = viewController
    }

    // MARK: - ViewControllerRouterInput

    func navigateToPushedViewController(value: Int) {
        let pushedViewController = PushedViewController.instantiate()
        pushedViewController.configure(viewModel: PushedViewModel(value: value))
        viewController?.navigationController?.pushViewController(pushedViewController, animated: true)
    }

}
Run Code Online (Sandbox Code Playgroud)

navigateToPushedViewControllerFUNC可以把你想要的任何参数(这是很好的封装参数之前配置新的VC,所以你可能想这样做).

PushedViewController没有任何具体的实施.只是configure()方法和assert(通知你有关遗失的configure()电话):

final class PushedViewModel {

    let value: Int

    init(value: Int) {
        self.value = value
    }

}

final class PushedViewController: UIViewController, StoryboardBased {

    @IBOutlet weak var label: UILabel!

    private var viewModel: PushedViewModel!

    func configure(viewModel: PushedViewModel) {
        self.viewModel = viewModel
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        assert(viewModel != nil, "viewModel is nil. You should call configure method before push vc.")

        label.text = "Pushed View Controller with value: \(viewModel.value)"
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:另外,我使用Reusablepod来减少样板代码.

结果:

在此输入图像描述