@@ -13,6 +13,12 @@ import UIKit
13
13
import RxCocoa
14
14
#endif
15
15
16
+ public protocol RxPickerViewDataSourceType {
17
+ /// Type of elements that can be bound to table view.
18
+ associatedtype Element
19
+
20
+ func pickerView( _ pickerView: UIPickerView , observedEvent: Event < Element > )
21
+ }
16
22
17
23
open class RxPickerViewDataSource < T> : NSObject , UIPickerViewDataSource {
18
24
public typealias NumberOfComponentsProvider = ( RxPickerViewDataSource , UIPickerView , T ) -> Int
@@ -25,8 +31,8 @@ open class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {
25
31
super. init ( )
26
32
}
27
33
28
- var numberOfComponentsProvider : NumberOfComponentsProvider !
29
- var numberOfRowsInComponentProvider : NumberOfRowsInComponentProvider !
34
+ public var numberOfComponentsProvider : NumberOfComponentsProvider !
35
+ public var numberOfRowsInComponentProvider : NumberOfRowsInComponentProvider !
30
36
31
37
//MARK: UIPickerViewDataSource
32
38
@@ -39,11 +45,24 @@ open class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {
39
45
}
40
46
}
41
47
48
+ extension RxPickerViewDataSource : RxPickerViewDataSourceType {
49
+ public func pickerView( _ pickerView: UIPickerView , observedEvent: Event < T > ) {
50
+ UIBindingObserver ( UIElement: self ) { ( dataSource, components) in
51
+ dataSource. components = components
52
+ pickerView. reloadAllComponents ( )
53
+ } . on ( observedEvent)
54
+ }
55
+ }
56
+
42
57
open class RxPickerViewStringAdapter < T> : RxPickerViewDataSource < T > , UIPickerViewDelegate {
43
58
public typealias TitleForRowProvider = ( RxPickerViewStringAdapter < T > , UIPickerView , T , Int , Int ) -> String ?
44
59
45
60
public var titleForRowProvider : TitleForRowProvider ! = nil
46
61
62
+ public override init ( components: T ) {
63
+ super. init ( components: components)
64
+ }
65
+
47
66
open func pickerView( _ pickerView: UIPickerView , titleForRow row: Int , forComponent component: Int ) -> String ? {
48
67
return titleForRowProvider ( self , pickerView, components, row, component)
49
68
}
@@ -54,6 +73,10 @@ open class RxPickerViewAttributedStringAdapter<T>: RxPickerViewDataSource<T>, UI
54
73
55
74
public var attributedTitleForRowProvider : AttributedTitleForRowProvider ! = nil
56
75
76
+ public override init ( components: T ) {
77
+ super. init ( components: components)
78
+ }
79
+
57
80
open func pickerView( _ pickerView: UIPickerView , attributedTitleForRow row: Int , forComponent component: Int ) -> NSAttributedString ? {
58
81
return attributedTitleForRowProvider ( self , pickerView, components, row, component)
59
82
}
@@ -64,7 +87,28 @@ open class RxPickerViewViewAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDe
64
87
65
88
public var viewForRowProvider : ViewForRowProvider !
66
89
90
+ public override init ( components: T ) {
91
+ super. init ( components: components)
92
+ }
93
+
67
94
open func pickerView( _ pickerView: UIPickerView , viewForRow row: Int , forComponent component: Int , reusing view: UIView ? ) -> UIView {
68
- return viewForRowProvider ( self , pickerView, components, row, component, view)
95
+ return viewForRowProvider ( self , pickerView, components, row, component, view)
69
96
}
70
97
}
98
+
99
+ extension Reactive where Base: UIPickerView {
100
+ public func items< O: ObservableType ,
101
+ Adapter: RxPickerViewDataSourceType & UIPickerViewDataSource & UIPickerViewDelegate > ( adapter: Adapter )
102
+ -> ( _ source: O )
103
+ -> Disposable where O. E == Adapter . Element {
104
+ return { source in
105
+ self . base. delegate = adapter
106
+ self . base. dataSource = adapter
107
+ return source. subscribe { [ weak pickerView = self . base] ( event) in
108
+ guard let pickerView = pickerView else { return }
109
+ adapter. pickerView ( pickerView, observedEvent: event)
110
+ }
111
+ }
112
+ }
113
+ }
114
+
0 commit comments