如何改变 UISlider 的值

How to get change the value of the UISlider

如何在移动 UISlider 时获取值?

我正在使用以下代码:

ViewModel:

import Foundation
import RxSwift

final class ViewModel {

    private let disposeBag = DisposeBag()

    var value: Variable<Float>

    init() {

        self.value = Variable(Float(0.0))

    }
}

ViewController:

@IBOutlet var slider: UISlider!

private var viewModel: ViewModel!
private let disposeBag = DisposeBag()

override func viewDidLoad() {
    viewModel = ViewModel()

    slider.rx.value
        .subscribe(onNext: { (value) in
            self.viewModel.value = Variable(Float(value))
        })
        .addDisposableTo(disposeBag) 
}

但是这段代码不起作用。我的错误是什么?

未测试,但我会尝试:

override func viewDidLoad() {
    viewModel = ViewModel()

    slider.rx.value
        .subscribe(onNext: { (value) in
            self.viewModel.value.value = Float(value) 
        })
        .addDisposableTo(disposeBag) 
}

此外,我会将 viewModel 中的 value 属性 重命名为 sliderValue(或其他名称,但不是 value)。如果这样做,您的代码看起来会更好:

self.viewModel.sliderValue.value = Float(value)

而不是

self.viewModel.value.value = ...

您正在替换变量而不是向其中插入新值。这肯定会失败。

ViewModel.value 应该是 let 而不是 var。您不想替换 Variable,而是想将新值 分配给 。当你这样做的时候,让你的 ViewModel 成为一个结构:

struct ViewModel {
    let value = Variable<Float>(0)
}

如果必须,它可以是最终的 class,但 value 仍然应该是 let 而不是 var

您的 viewDidLoad 应如下所示:

public override func viewDidLoad() {
    super.viewDidLoad()

    slider.rx.value
        .subscribe(onNext: { value in
            self.viewModel.value.value = value
        })
        .disposed(by: disposeBag)
}

或者更好:

public override func viewDidLoad() {
    super.viewDidLoad()

    slider.rx.value
        .bind(to: viewModel.value)
        .disposed(by: disposeBag)
}

甚至更好...任何订阅 ViewModel.value 的人都应该 subscribe/bind 直接订阅 slider.rx.value。这样你就可以摆脱中间人。

像这样:

public class ViewController: UIViewController {

    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var label: UILabel!

    private let disposeBag = DisposeBag()

    public override func viewDidLoad() {
        super.viewDidLoad()

        slider.rx.value
            .map { "The slider's value is \([=13=])" }
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }

}

当您移动滑块时,您会看到标签的文本发生变化。

如果您使用新的 BehaviorRelay 而不是旧的 Variable:

struct MyViewModel {
    let value = BehaviorRelay<Float>(value: 0)
}

class ViewController: UIViewController {
    @IBOutlet var slider: UISlider!
    @IBOutlet var valueLabel: UILabel!
    private var viewModel = MyViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

        slider.rx.value
            .bind(to: viewModel.value)
            .disposed(by: rx.disposeBag)

        // If you want to listen and bind to a label
        viewModel.value.asDriver()
            .map { "Value: \([=10=] * 100)%" }
            .drive(valueLabel.rx.text)
            .disposed(by: rx.disposeBag)
    }
}