Skip to content

Commit f55c3f6

Browse files
committed
Add convenience UIPickerView rx extensions example
1 parent 508454f commit f55c3f6

File tree

4 files changed

+227
-108
lines changed

4 files changed

+227
-108
lines changed

RxExample/RxExample.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
2864D5F21D995FCD004F8484 /* Application+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2864D5F11D995FCD004F8484 /* Application+Extensions.swift */; };
1818
2864D5F31D995FCD004F8484 /* Application+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2864D5F11D995FCD004F8484 /* Application+Extensions.swift */; };
1919
8479BC721C3BDAD400FB8B54 /* ImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8479BC701C3BCB9800FB8B54 /* ImagePickerController.swift */; };
20+
A5CD038F1F1670E50005A376 /* CustomPickerViewAdapterExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CD038E1F1670E50005A376 /* CustomPickerViewAdapterExampleViewController.swift */; };
2021
AE51C1C91DE735D8005BAF5F /* APIWrappers.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AE51C1C81DE735D8005BAF5F /* APIWrappers.storyboard */; };
2122
AE51C1CB1DE735E3005BAF5F /* Calculator.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AE51C1CA1DE735E3005BAF5F /* Calculator.storyboard */; };
2223
AE51C1CD1DE735EF005BAF5F /* Geolocation.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AE51C1CC1DE735EF005BAF5F /* Geolocation.storyboard */; };
@@ -432,6 +433,7 @@
432433
252C9F791F14115B00F5F951 /* SimpleUIPickerViewExample.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SimpleUIPickerViewExample.storyboard; sourceTree = "<group>"; };
433434
2864D5F11D995FCD004F8484 /* Application+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Application+Extensions.swift"; sourceTree = "<group>"; };
434435
8479BC701C3BCB9800FB8B54 /* ImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePickerController.swift; sourceTree = "<group>"; };
436+
A5CD038E1F1670E50005A376 /* CustomPickerViewAdapterExampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPickerViewAdapterExampleViewController.swift; sourceTree = "<group>"; };
435437
AE51C1C81DE735D8005BAF5F /* APIWrappers.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = APIWrappers.storyboard; sourceTree = "<group>"; };
436438
AE51C1CA1DE735E3005BAF5F /* Calculator.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Calculator.storyboard; sourceTree = "<group>"; };
437439
AE51C1CC1DE735EF005BAF5F /* Geolocation.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Geolocation.storyboard; sourceTree = "<group>"; };
@@ -645,6 +647,7 @@
645647
children = (
646648
252C9F771F14111800F5F951 /* SimplePickerViewExampleViewController.swift */,
647649
252C9F791F14115B00F5F951 /* SimpleUIPickerViewExample.storyboard */,
650+
A5CD038E1F1670E50005A376 /* CustomPickerViewAdapterExampleViewController.swift */,
648651
);
649652
path = UIPickerViewExample;
650653
sourceTree = "<group>";
@@ -1492,6 +1495,7 @@
14921495
C864BAD71C3332F10083833C /* DetailViewController.swift in Sources */,
14931496
C822B1DF1C14CEAA0088A01A /* BindingExtensions.swift in Sources */,
14941497
C864BAD91C3332F10083833C /* RandomUserAPI.swift in Sources */,
1498+
A5CD038F1F1670E50005A376 /* CustomPickerViewAdapterExampleViewController.swift in Sources */,
14951499
C886A68B1D85AC9400653EE4 /* UIImagePickerController+Rx.swift in Sources */,
14961500
C8477FF01D29DE8C0074454A /* AnimatableSectionModelType+ItemPath.swift in Sources */,
14971501
C864BADF1C3332F10083833C /* UIImageView+Extensions.swift in Sources */,
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
//
2+
// CustomPickerViewAdapterExampleViewController.swift
3+
// RxExample
4+
//
5+
// Created by Sergey Shulga on 12/07/2017.
6+
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
7+
//
8+
9+
import UIKit
10+
#if !RX_NO_MODULE
11+
import RxSwift
12+
import RxCocoa
13+
#endif
14+
15+
final class CustomPickerViewAdapterExampleViewController: ViewController {
16+
@IBOutlet weak var pickerView1: UIPickerView!
17+
@IBOutlet weak var pickerView2: UIPickerView!
18+
@IBOutlet weak var pickerView3: UIPickerView!
19+
20+
override func viewDidLoad() {
21+
super.viewDidLoad()
22+
23+
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
24+
.bind(to: pickerView1.rx.items(adapter: CustomStringPickerViewAdapter()))
25+
.disposed(by: disposeBag)
26+
27+
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
28+
.bind(to: pickerView2.rx.items(adapter: CustomAttributedStringPickerViewAdapter()))
29+
.disposed(by: disposeBag)
30+
31+
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
32+
.bind(to: pickerView3.rx.items(adapter: PickerViewViewAdapter()))
33+
.disposed(by: disposeBag)
34+
}
35+
}
36+
37+
final class CustomStringPickerViewAdapter
38+
: NSObject
39+
, UIPickerViewDataSource
40+
, UIPickerViewDelegate
41+
, RxPickerViewDataSourceType {
42+
typealias Element = [[CustomStringConvertible]]
43+
private var items: [[CustomStringConvertible]] = []
44+
45+
func numberOfComponents(in pickerView: UIPickerView) -> Int {
46+
return items.count
47+
}
48+
49+
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
50+
return items[component].count
51+
}
52+
53+
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
54+
return items[component][row].description
55+
}
56+
57+
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
58+
UIBindingObserver(UIElement: self) { (adapter, items) in
59+
adapter.items = items
60+
pickerView.reloadAllComponents()
61+
}.on(observedEvent)
62+
}
63+
}
64+
65+
final class CustomAttributedStringPickerViewAdapter
66+
: NSObject
67+
, UIPickerViewDataSource
68+
, UIPickerViewDelegate
69+
, RxPickerViewDataSourceType {
70+
typealias Element = [[CustomStringConvertible]]
71+
private var items: [[CustomStringConvertible]] = []
72+
73+
func numberOfComponents(in pickerView: UIPickerView) -> Int {
74+
return items.count
75+
}
76+
77+
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
78+
return items[component].count
79+
}
80+
81+
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
82+
return NSAttributedString(string: items[component][row].description,
83+
attributes: [
84+
NSForegroundColorAttributeName: UIColor.cyan,
85+
NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue
86+
])
87+
}
88+
89+
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
90+
UIBindingObserver(UIElement: self) { (adapter, items) in
91+
adapter.items = items
92+
pickerView.reloadAllComponents()
93+
}.on(observedEvent)
94+
}
95+
}
96+
97+
final class PickerViewViewAdapter
98+
: NSObject
99+
, UIPickerViewDataSource
100+
, UIPickerViewDelegate
101+
, RxPickerViewDataSourceType {
102+
typealias Element = [[CustomStringConvertible]]
103+
private var items: [[CustomStringConvertible]] = []
104+
105+
func numberOfComponents(in pickerView: UIPickerView) -> Int {
106+
return items.count
107+
}
108+
109+
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
110+
return items[component].count
111+
}
112+
113+
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
114+
let label = UILabel()
115+
label.text = items[component][row].description
116+
label.textColor = UIColor.orange
117+
label.font = UIFont.preferredFont(forTextStyle: .headline)
118+
label.textAlignment = .center
119+
return label
120+
}
121+
122+
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
123+
UIBindingObserver(UIElement: self) { (adapter, items) in
124+
adapter.items = items
125+
pickerView.reloadAllComponents()
126+
}.on(observedEvent)
127+
}
128+
}
129+
130+

RxExample/RxExample/Examples/UIPickerViewExample/SimplePickerViewExampleViewController.swift

Lines changed: 18 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -21,111 +21,28 @@ final class SimplePickerViewExampleViewController: ViewController {
2121
override func viewDidLoad() {
2222
super.viewDidLoad()
2323

24-
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
25-
.bind(to: pickerView1.rx.items(adapter: CustomStringPickerViewAdapter()))
24+
Observable.just([1, 2, 3])
25+
.bind(to: pickerView1.rx.itemTitles) { _, item in
26+
return "\(item)"
27+
}
2628
.disposed(by: disposeBag)
2729

28-
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
29-
.bind(to: pickerView2.rx.items(adapter: CustomAttributedStringPickerViewAdapter()))
30+
Observable.just([1, 2, 3])
31+
.bind(to: pickerView2.rx.itemAttributedTitles) { _, item in
32+
return NSAttributedString(string: "\(item)",
33+
attributes: [
34+
NSForegroundColorAttributeName: UIColor.cyan,
35+
NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue
36+
])
37+
}
3038
.disposed(by: disposeBag)
3139

32-
Observable.just([[1, 2, 3], [5, 8, 13], [21, 34]])
33-
.bind(to: pickerView3.rx.items(adapter: PickerViewViewAdapter()))
40+
Observable.just([UIColor.red, UIColor.green, UIColor.blue])
41+
.bind(to: pickerView3.rx.items) { _, item, _ in
42+
let view = UIView()
43+
view.backgroundColor = item
44+
return view
45+
}
3446
.disposed(by: disposeBag)
3547
}
3648
}
37-
38-
final class CustomStringPickerViewAdapter
39-
: NSObject
40-
, UIPickerViewDataSource
41-
, UIPickerViewDelegate
42-
, RxPickerViewDataSourceType {
43-
typealias Element = [[CustomStringConvertible]]
44-
private var items: [[CustomStringConvertible]] = []
45-
46-
func numberOfComponents(in pickerView: UIPickerView) -> Int {
47-
return items.count
48-
}
49-
50-
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
51-
return items[component].count
52-
}
53-
54-
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
55-
return items[component][row].description
56-
}
57-
58-
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
59-
UIBindingObserver(UIElement: self) { (adapter, items) in
60-
adapter.items = items
61-
pickerView.reloadAllComponents()
62-
}.on(observedEvent)
63-
}
64-
}
65-
66-
final class CustomAttributedStringPickerViewAdapter
67-
: NSObject
68-
, UIPickerViewDataSource
69-
, UIPickerViewDelegate
70-
, RxPickerViewDataSourceType {
71-
typealias Element = [[CustomStringConvertible]]
72-
private var items: [[CustomStringConvertible]] = []
73-
74-
func numberOfComponents(in pickerView: UIPickerView) -> Int {
75-
return items.count
76-
}
77-
78-
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
79-
return items[component].count
80-
}
81-
82-
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
83-
return NSAttributedString(string: items[component][row].description,
84-
attributes: [
85-
NSForegroundColorAttributeName: UIColor.cyan,
86-
NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue
87-
])
88-
}
89-
90-
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
91-
UIBindingObserver(UIElement: self) { (adapter, items) in
92-
adapter.items = items
93-
pickerView.reloadAllComponents()
94-
}.on(observedEvent)
95-
}
96-
}
97-
98-
final class PickerViewViewAdapter
99-
: NSObject
100-
, UIPickerViewDataSource
101-
, UIPickerViewDelegate
102-
, RxPickerViewDataSourceType {
103-
typealias Element = [[CustomStringConvertible]]
104-
private var items: [[CustomStringConvertible]] = []
105-
106-
func numberOfComponents(in pickerView: UIPickerView) -> Int {
107-
return items.count
108-
}
109-
110-
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
111-
return items[component].count
112-
}
113-
114-
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
115-
let label = UILabel()
116-
label.text = items[component][row].description
117-
label.textColor = UIColor.orange
118-
label.font = UIFont.preferredFont(forTextStyle: .headline)
119-
label.textAlignment = .center
120-
return label
121-
}
122-
123-
func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>) {
124-
UIBindingObserver(UIElement: self) { (adapter, items) in
125-
adapter.items = items
126-
pickerView.reloadAllComponents()
127-
}.on(observedEvent)
128-
}
129-
}
130-
131-

0 commit comments

Comments
 (0)