Skip to content

Commit bf74d88

Browse files
author
sergey
committed
Add initialisers and UIPickerView extension
1 parent 5b0595a commit bf74d88

File tree

1 file changed

+47
-3
lines changed

1 file changed

+47
-3
lines changed

Sources/DataSources+Rx/RxPickerViewAdapter.swift

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ import UIKit
1313
import RxCocoa
1414
#endif
1515

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+
}
1622

1723
open class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {
1824
public typealias NumberOfComponentsProvider = (RxPickerViewDataSource, UIPickerView, T) -> Int
@@ -25,8 +31,8 @@ open class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {
2531
super.init()
2632
}
2733

28-
var numberOfComponentsProvider: NumberOfComponentsProvider!
29-
var numberOfRowsInComponentProvider: NumberOfRowsInComponentProvider!
34+
public var numberOfComponentsProvider: NumberOfComponentsProvider!
35+
public var numberOfRowsInComponentProvider: NumberOfRowsInComponentProvider!
3036

3137
//MARK: UIPickerViewDataSource
3238

@@ -39,11 +45,24 @@ open class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {
3945
}
4046
}
4147

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+
4257
open class RxPickerViewStringAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDelegate {
4358
public typealias TitleForRowProvider = (RxPickerViewStringAdapter<T>, UIPickerView, T,Int, Int) -> String?
4459

4560
public var titleForRowProvider: TitleForRowProvider! = nil
4661

62+
public override init(components: T) {
63+
super.init(components: components)
64+
}
65+
4766
open func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
4867
return titleForRowProvider(self, pickerView, components, row, component)
4968
}
@@ -54,6 +73,10 @@ open class RxPickerViewAttributedStringAdapter<T>: RxPickerViewDataSource<T>, UI
5473

5574
public var attributedTitleForRowProvider: AttributedTitleForRowProvider! = nil
5675

76+
public override init(components: T) {
77+
super.init(components: components)
78+
}
79+
5780
open func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
5881
return attributedTitleForRowProvider(self, pickerView, components, row, component)
5982
}
@@ -64,7 +87,28 @@ open class RxPickerViewViewAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDe
6487

6588
public var viewForRowProvider: ViewForRowProvider!
6689

90+
public override init(components: T) {
91+
super.init(components: components)
92+
}
93+
6794
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)
6996
}
7097
}
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

Comments
 (0)