让我们说我有一个带有值的CustomView。 我想使用rx.value(Observable)将值公开给世界,而不是必须通过值(Int)来访问它。
final class CustomView: UIView {
var value: Int = 0
...
}
我从UIStepper + Rx复制了此内容
:extension Reactive where Base: CustomView {
var value: ControlProperty<Int> {
return base.rx.controlProperty(editingEvents: [.allEditingEvents, .valueChanged],
getter: { customView in
customView.currentValue
}, setter: { customView, value in
customView.currentValue = value
}
)
}
}
final class CustomView: UIControl {
fileprivate var currentValue = 1 {
didSet {
checkButtonState()
valueLabel.text = currentValue.description
}
}
// inside i set currentValue = 3
}
但是customView.rx.value不会发出任何值
答案 0 :(得分:5)
缺少的是,您需要在UIControl
上发送操作。检查下一个示例:
class CustomView: UIControl {
var value: Int = 0 {
didSet { sendActions(for: .valueChanged) } // You are missing this part
}
}
extension Reactive where Base: CustomView {
var value: ControlProperty<Int> {
return base.rx.controlProperty(editingEvents: UIControlEvents.valueChanged,
getter: { customView in
return customView.value },
setter: { (customView, newValue) in
customView.value = newValue})
}
}
答案 1 :(得分:0)
我认为您想使用一个Subject,可以是PublishSubject或Variable。
PublishSubject以空序列开始,并且仅向其订阅者发出新的Next事件。变量允许在开始处设置初始值,并向订户重放最新或初始值。保证变量不会失败,也不会并且不会发出错误。 本教程对https://medium.com/@dkhuong291/rxswift-subjects-part1-publishsubjects-103ff6b06932
有帮助所以您需要像这样设置主题的值:
var myValue = PublishSubject<Int>()
...
myValue.onNext(2)
或
var myValue = Variable<Int>(0)
...
myValue.value = 2
然后订阅它:
var disposeBag = DisposeBag()
myValue.asObservable()
.subscribe({
print($0)
}).disposed(by: disposebag)
此外,您可能只想使用字符串Subject将值绑定到UILabel。
var myValue = PublishSubject<String>()
...
myValue.onNext("\(4)")
...
func viewDidLoad() {
super.viewDidLoad()
myValue.asObservable().bind(to: valueLabel.text)
}
或者,假设您要通过rx.value设置值。您将需要使用RxCocoa创建customView的DelegateProxy类。这与为CustomView创建委托相同,您可以在其中通过在任意位置设置属性值并通过customView.rx收听属性来委托属性。
我在上个月What delegate cant do than Reactive?上发布了一些内容。 它确实帮助我轻松控制了自定义视图属性。