【问题标题】:How i can push new view when i use coordinator with mvvm-c Rxswift?当我将协调器与 mvvm-c Rxswift 一起使用时,如何推送新视图?
【发布时间】:2020-07-08 08:38:32
【问题描述】:

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

【问题讨论】:

    标签: swift xcode mvvm viewmodel rx-swift


    【解决方案1】:

    也许这个例子会对你有所帮助:

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

    通过https://github.com/danielt1263/RxEarthquake了解更多信息

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多