首页 > 解决方案 > 使用 RXSwift 将视图控制器中的元组或字符串绑定到视图模型

问题描述

我需要绑定一个元组(String,Int)来查看模型

class ViewModel {

var firstAttempt = PublishSubject<(password: String, count: Int)>()
var isValidFirstAttempt: Observable<Bool> {
    return firstAttempt.asObservable().map{
        if $0.count < 4 {
            self.onShowError.onNext("error")
            return false
        }
        return true
    }
}
let onShowError = PublishSubject<String>()

视图控制器

class ViewController: UIViewController {

var viewModel =  ViewModel()
var firstAttempt = BehaviorRelay<(value:String, count: Int)>(value: ("", 0))

func bindControllerComponent() {
    firstAttempt.bind(to: viewModel.firstAttempt).disposed(by: disposeBag)
    viewModel.firstAttempt.bind(to: firstAttempt).disposed(by: disposeBag)
}

在视图控制器中执行self.firstAttempt.accept(("password", 4))我想更改视图模型是否可能?

标签: iosswiftmvvmbindingrx-swift

解决方案


这应该可以帮助您:

class ViewModel {

    let firstAttempt = PublishSubject<(password: String, count: Int)>()

    var isValidFirstAttempt: Observable<Bool> {
        return firstAttempt.map { 3 < $0.count }
    }

    var onShowError: Observable<String> {
        return firstAttempt.filter { $0.count < 4 }.map { _ in "error" }
    }
}

class ViewController: UIViewController {

    var viewModel =  ViewModel()
    let firstAttempt = BehaviorRelay<(password: String, count: Int)>(value: ("", 0))
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        firstAttempt.bind(to: viewModel.firstAttempt).disposed(by: disposeBag)

        viewModel.isValidFirstAttempt
            .bind(onNext: { print("isValid?", $0) })
            .disposed(by: disposeBag)

        viewModel.onShowError
            .bind(onNext: { [weak self] message in
                let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self?.present(alert, animated: true, completion: nil)
            })
            .disposed(by: disposeBag)
    }
}

推荐阅读