简体   繁体   中英

How i can push new view when i use coordinator with mvvm-c Rxswift?

我使用 MVVM-C (Rxswift) 当我尝试将 HomeCoordinator 与 HomeViewModel 连接以将新的 VC 推送到 Coordinator 时,我必须创建 homeVC、HomeViewModel 和 HomeCoordinator 它不采取任何行动任何人都可以帮助我举例或解释如何解决这个问题问题?

Maybe this example will help you:

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

Learn more at https://github.com/danielt1263/RxEarthquake

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM