swift - 当我将协调器与 mvvm-c Rxswift 一起使用时,如何推送新视图?
问题描述
我使用 MVVM-C (Rxswift) 我必须创建 homeVC , HomeViewModel 和 HomeCoordinator 当我尝试将 HomeCoordinator 与 HomeViewModel 连接以将新的 VC 推送到 Coordinator 它没有采取任何行动 谁能帮助我举例或解释如何解决这个问题问题?
解决方案
也许这个例子会帮助你:
//
// ExampleLiftData.swift
//
// Created by Daniel Tartaglia on 2/18/20.
// Copyright © 2020 Daniel Tartaglia. MIT License.
//
import UIKit
import RxSwift
import RxCocoa
import RxEnumKit
import EnumKit
// MARK: - ExamplePresenter
func presentExample(window: UIWindow) {
let value = PublishSubject<String>()
let storyboard = UIStoryboard(name: "Example", bundle: nil)
let controller = storyboard.instantiateInitialViewController() as! ExampleViewController
let action = controller.install(viewModel: exampleViewModel(value: value.asObservable()))
_ = action
.filter(case: ExampleAction.showRequest)
.flatMap { [unowned controller] _ in
presentRequest(on: controller, title: "", message: "Add how much?")
}
.bind(to: value)
window.rootViewController = controller
}
enum ExampleAction: CaseAccessible {
case showRequest
}
// MARK: - ExampleViewModel
func exampleViewModel(value: Observable<String>) -> (ExampleInput) -> (ExampleOutput, Observable<ExampleAction>) {
return { input in
let state = value
.compactMap { Int($0) }
.scan(0, accumulator: +)
.startWith(0)
return (
ExampleOutput(text: state.map { "\($0)" }),
input.buttonTapped.map { ExampleAction.showRequest }
)
}
}
struct ExampleInput {
let buttonTapped: Observable<Void>
}
// MARK: - ExampleView
class ExampleViewController: UIViewController, HasViewModel {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var label: UILabel!
var buildOutput: (ExampleInput) -> ExampleOutput = { _ in fatalError() }
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let input = ExampleInput(
buttonTapped: button.rx.tap.asObservable()
)
let output = buildOutput(input)
output.text.bind(to: label.rx.text).disposed(by: disposeBag)
}
}
struct ExampleOutput {
let text: Observable<String>
}
// MARK: - AlertPresenter
func presentRequest(on root: UIViewController, title: String, message: String) -> Observable<String> {
let result = PublishSubject<String>()
let controller = UIAlertController(title: title.isEmpty ? nil : title, message: message.isEmpty ? nil : message, preferredStyle: .alert)
controller.addTextField(configurationHandler: { $0.keyboardType = .numberPad })
let ok = UIAlertAction(title: "OK", style: .default, handler: { [unowned controller] _ in
result.onNext(controller.textFields?[0].text ?? "")
result.onCompleted()
})
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { _ in
result.onCompleted()
})
controller.addAction(ok)
controller.addAction(cancel)
root.present(controller, animated: true)
return result
}
推荐阅读
- javascript - 一些 UTF-8 字符(土耳其语)在 jsPDF 中显示为 HTML 数字代码
- java - 为什么清除后LineChart上的数据还是这样?
- vb.net - 如何删除两个datagridview的匹配行?
- android - Flutter:通过 Api 的动态 App-Icon 和 App-Name
- sql - 有什么方法可以识别在使用 BCP 命令导出期间导致错误的特定记录
- c# - 重定向到区域操作中的操作
- php - 在结帐中添加自定义字段并将其显示在 WooCommerce 管理订单页面中
- linux - linux中后台进程和守护进程之间的区别
- javascript - Webpack 文件加载器和 Svelte 样式的背景图像不起作用
- java - getPropertyMsg 中的空指针异常?