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)
}
在viewModeldistanceRank
中,定义如下:
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