如何改变 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)
}
}
如何在移动 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)
}
}