如何更改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)
}
但这代码不起作用。我的错误是什么?
答
没有测试,但我会尝试:
override func viewDidLoad() {
viewModel = ViewModel()
slider.rx.value
.subscribe(onNext: { (value) in
self.viewModel.value.value = Float(value)
})
.addDisposableTo(disposeBag)
}
此外,我会在你的value
属性重命名viewModel
到sliderValue
(或什么,但不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)
}
}
你会看到标签的文本变化移动滑块。
您使用的是什么版本的RxSwift? –
@TrungAnhPham我正在使用版本3.2 – nik3212
我只是试过你的代码,它的工作原理(Xcode 9 beta 2,Swift 3) –