Saz*_*han 3 architecture design-patterns ios swift
我发现Router在Clean Swift架构中负责导航和传递数据.view controllers.一些样本和文章描述了Routers使用segue传递和与视图控制器通信.什么是便利性设计时,我不希望使用任何SEGUE Storyboard.在Clean Swift中是否可以在没有segue的情况下传递数据?如果您用最简单的完整示例进行描述,我将不胜感激.
文章说你可以:
// 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)
这ViewController有router实现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来减少样板代码.
结果: