Ios 支持RxSwift的自定义UISlider

Ios 支持RxSwift的自定义UISlider,ios,swift,rx-swift,Ios,Swift,Rx Swift,我已经创建了一个自定义控件,它可以作为UISlider工作。现在我想将它与RxSwift一起使用,为此我需要控件的rx\u值like属性。 我在GitHub上找到了UISlider的RxSwift代码: extension UISlider { /** Reactive wrapper for `value` property. */ public var rx_value: ControlProperty<Float> { retu

我已经创建了一个自定义控件,它可以作为
UISlider
工作。现在我想将它与RxSwift一起使用,为此我需要控件的
rx\u值
like属性。 我在GitHub上找到了
UISlider
的RxSwift代码:

extension UISlider {

    /**
    Reactive wrapper for `value` property.
    */
    public var rx_value: ControlProperty<Float> {
        return UIControl.rx_value(
            self,
            getter: { slider in
                slider.value
            }, setter: { slider, value in
                slider.value = value
            }
        )
    }

}
在viewModel中:

distanceRank
            .observeOn(MainScheduler.instance).subscribeNext { rank in
                print(rank)
                self.discoverNodes(true)
        }
在viewModel
distanceRank
中,定义如下:

let distanceRank: Observable<Int>

它是
公共的
。你凭什么认为它是私人的?我收到一个错误“类型'UIControl'没有成员'rx_值'”。然后我发现了这个帖子:。然而,在我的案例中,似乎解决方案不起作用的问题。当我订阅“值”时,我只收到第一个值更改的通知。啊,我明白了,是的,它不包括在
RxCocoa
目标中。你能展示你试图使用该解决方案的实际代码吗?@solidcell我已经添加了部分代码。还有其他有用的东西吗?还不清楚
latestRank
distanceRank
是如何相互关联的,如果有的话,也不清楚您将如何使用
latestRank
distanceRank
rx\u distance
的定义。这是
public
。你凭什么认为它是私人的?我收到一个错误“类型'UIControl'没有成员'rx_值'”。然后我发现了这个帖子:。然而,在我的案例中,似乎解决方案不起作用的问题。当我订阅“值”时,我只收到第一个值更改的通知。啊,我明白了,是的,它不包括在
RxCocoa
目标中。你能展示你试图使用该解决方案的实际代码吗?@solidcell我已经添加了部分代码。还有其他有用的东西吗?还不清楚
latestRank
distanceRank
是如何相互关联的(如果有的话),也不清楚您将如何使用
latestRank
,也不清楚
distanceRank
rx\u distance
是如何定义的。
let distanceRank: Observable<Int>
#if os(iOS) || os(tvOS)
import Foundation
#if !RX_NO_MODULE
    import RxSwift
    import RxCocoa
#endif
import UIKit

extension OneSlider {

    public var rx_distance: ControlProperty<Int> {
        return UIControl.valuePublic(
            self,
            getter: { slider in
                slider.distanceRank
            }, setter: { slider, value in
                slider.distanceRank = value
            }
        )
    }

}

extension UIControl {
    static func valuePublic<T, ControlType: UIControl>(control: ControlType, getter:  ControlType -> T, setter: (ControlType, T) -> ()) -> ControlProperty<T> {
        let values: Observable<T> = Observable.deferred { [weak control] in
            guard let existingSelf = control else {
                return Observable.empty()
            }

            return existingSelf.rx_controlEvent([.AllEditingEvents, .ValueChanged])
                .flatMap { _ in
                    return control.map { Observable.just(getter($0)) } ?? Observable.empty()
                }
                .startWith(getter(existingSelf))
        }
        return ControlProperty(values: values, valueSink: UIBindingObserver(UIElement: control) { control, value in
            setter(control, value)
            })
    }
}

#endif