将rx.value添加到我的CustomView

时间:2018-06-21 13:44:36

标签: ios swift rx-swift rx-cocoa

让我们说我有一个带有值的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不会发出任何值

2 个答案:

答案 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?上发布了一些内容。 它确实帮助我轻松控制了自定义视图属性。