如何更改UISlider的价值

问题描述:

如何在移动UISlider时获取价值?如何更改UISlider的价值

我用下面的代码:

视图模型:

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

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

+0

您使用的是什么版本的RxSwift? –

+0

@TrungAnhPham我正在使用版本3.2 – nik3212

+0

我只是试过你的代码,它的工作原理(Xcode 9 beta 2,Swift 3) –

没有测试,但我会尝试:

override func viewDidLoad() { 
    viewModel = ViewModel() 

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

此外,我会在你的value属性重命名viewModelsliderValue(或什么,但不value)。如果你这样做,你的代码会更好看:的

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

代替

self.viewModel.value.value = ...

你要替换的变量而不是插入一个新的价值到它。这是保证失败。

ViewModel.value应该是let而不是var。你不想替换变量,你想分配一个新的值它。当你在它,让您的视图模型一个结构:

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

它可以是一个最终类,如果你一定要,但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应该订阅/直接绑定到滑块。代替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 \($0)" } 
      .bind(to: label.rx.text) 
      .disposed(by: disposeBag) 
    } 

} 

你会看到标签的文本变化移动滑块。