From d298b9c137bd1fa9b587e653e96439033601829c Mon Sep 17 00:00:00 2001 From: Geoffrey Dagley Date: Tue, 7 Jan 2014 22:03:16 -0600 Subject: [PATCH] Initial support for multiple components --- BSModalPickerView/BSModalPickerView.h | 8 + BSModalPickerView/BSModalPickerView.m | 112 +++- .../ModalPickerDemo/ViewController.h | 2 + .../ModalPickerDemo/ViewController.m | 29 + .../en.lproj/ViewController.xib | 542 +++--------------- 5 files changed, 212 insertions(+), 481 deletions(-) diff --git a/BSModalPickerView/BSModalPickerView.h b/BSModalPickerView/BSModalPickerView.h index 834443b..8a26231 100644 --- a/BSModalPickerView/BSModalPickerView.h +++ b/BSModalPickerView/BSModalPickerView.h @@ -11,13 +11,21 @@ @interface BSModalPickerView : BSModalPickerBase +@property (nonatomic) NSMutableArray *selectedIndexes; @property (nonatomic) NSUInteger selectedIndex; @property (nonatomic, strong) NSString *selectedValue; +@property (nonatomic, strong) NSArray *selectedValues; @property (nonatomic, strong) NSArray *values; /* Initializes a new instance of the picker with the values to present to the user. (Note: call presentInView:withBlock: or presentInWindowWithBlock: to display the control) */ - (id)initWithValues:(NSArray *)values; +- (NSUInteger)selectedIndexInComponent:(NSUInteger)component; +- (NSString*)selectedValueInComponent:(NSUInteger)component; + +- (void)setSelectedIndex:(NSUInteger)selectedIndex inComponent:(int)component; +- (void)setSelectedValue:(NSString *)selectedValue inComponent:(int)component; + @end diff --git a/BSModalPickerView/BSModalPickerView.m b/BSModalPickerView/BSModalPickerView.m index 716d46c..91581fe 100644 --- a/BSModalPickerView/BSModalPickerView.m +++ b/BSModalPickerView/BSModalPickerView.m @@ -21,7 +21,22 @@ @implementation BSModalPickerView - (id)initWithValues:(NSArray *)values { self = [super init]; if (self) { - self.values = values; + if (values && [values count] > 0) { + // is it an array of arrays? + if ([[values objectAtIndex:0] isKindOfClass:[NSArray class]]) { + _values = values; + } + // else make it an array of 1 array + else { + _values = [[NSMutableArray alloc] initWithObjects:values, nil]; + } + + NSMutableArray *initialSelectedIndexes = [[NSMutableArray alloc] initWithCapacity:[values count]]; + for (NSObject* value in self.values) { + [initialSelectedIndexes addObject:[NSNumber numberWithInt:0]]; + } + _selectedIndexes = initialSelectedIndexes; + } self.userInteractionEnabled = YES; } return self; @@ -34,68 +49,117 @@ - (UIView *)pickerWithFrame:(CGRect)pickerFrame { pickerView.dataSource = self; pickerView.delegate = self; pickerView.showsSelectionIndicator = YES; - [pickerView selectRow:self.selectedIndex inComponent:0 animated:NO]; + for (int component = 0; component < self.selectedIndexes.count; component++) { + NSNumber* selectedIndex = [self.selectedIndexes objectAtIndex:component]; + [pickerView selectRow:[selectedIndex intValue] inComponent:component animated:NO]; + } return pickerView; } +- (NSUInteger)selectedIndex { + return [self selectedIndexInComponent:0]; +} + +- (NSUInteger)selectedIndexInComponent:(NSUInteger)component { + return [[self.selectedIndexes objectAtIndex:component] intValue]; +} + - (NSString *)selectedValue { - return [self.values objectAtIndex:self.selectedIndex]; + return [self selectedValueInComponent:0]; +} + +- (NSArray *)selectedValues { + NSMutableArray* values = [[NSMutableArray alloc] initWithCapacity:[self.values count]]; + for (int component = 0; component < self.selectedIndexes.count; component++) { + [values addObject:[self selectedValueInComponent:component]]; + } + return values; +} + +- (NSString *)selectedValueInComponent:(NSUInteger)component { + NSString* selectedValue = nil; + if (self.selectedIndexes.count > component) { + NSNumber* selectedIndex = [self.selectedIndexes objectAtIndex:component]; + selectedValue = [[self.values objectAtIndex:component] objectAtIndex:[selectedIndex intValue]]; + } + return selectedValue; } + #pragma mark - Custom Setters -- (void)setValues:(NSArray *)values { - _values = values; - - if (_values) { - if (self.picker) { - UIPickerView *pickerView = (UIPickerView *)self.picker; - [pickerView reloadAllComponents]; - self.selectedIndex = 0; - } +//- (void)setValues:(NSMutableArray *)values { +// _values = values; +// +// if (_values) { +// if (self.picker) { +// UIPickerView *pickerView = (UIPickerView *)self.picker; +// [pickerView reloadAllComponents]; +// self.selectedIndex = 0; +// } +// } +//} + +- (void)setSelectedIndex:(NSUInteger)index { + [self setSelectedIndex:index inComponent:0]; +} + +- (void)setSelectedIndexes:(NSMutableArray *)indexes { + for (int component = 0; component < indexes.count; component++) { + [self setSelectedIndex:[[indexes objectAtIndex:component] intValue] inComponent:component]; } } -- (void)setSelectedIndex:(NSUInteger)selectedIndex { - if (_selectedIndex != selectedIndex) { - _selectedIndex = selectedIndex; +- (void)setSelectedIndex:(NSUInteger)index inComponent:(int)component { + if (self.selectedIndexes.count > 0 && component < self.selectedIndexes.count) { + [self.selectedIndexes replaceObjectAtIndex:component withObject:[NSNumber numberWithInt:index]]; if (self.picker) { UIPickerView *pickerView = (UIPickerView *)self.picker; - [pickerView selectRow:selectedIndex inComponent:0 animated:YES]; + [pickerView selectRow:index inComponent:component animated:YES]; } } } -- (void)setSelectedValue:(NSString *)selectedValue { - NSInteger index = [self.values indexOfObject:selectedValue]; - [self setSelectedIndex:index]; +- (void)setSelectedValue:(NSString *)value { + [self setSelectedValue:value inComponent:0]; +} + +- (void)setSelectedValues:(NSMutableArray *)values { + for (int component = 0; component < values.count; component++) { + [self setSelectedValue:[values objectAtIndex:component] inComponent:component]; + } +} + +- (void)setSelectedValue:(NSString *)value inComponent:(int)component { + NSInteger index = [[self.values objectAtIndex:component] indexOfObject:value]; + [self setSelectedIndex:index inComponent:component]; } #pragma mark - Event Handler - (void)onDone:(id)sender { - self.selectedIndex = self.indexSelectedBeforeDismissal; +// self.selectedIndex = self.indexSelectedBeforeDismissal; [super onDone:sender]; } #pragma mark - Picker View Data Source - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - return 1; + return [self.values count]; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - return self.values.count; + return [[self.values objectAtIndex:component] count]; } #pragma mark - Picker View Delegate - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - return [self.values objectAtIndex:row]; + return [[self.values objectAtIndex:component] objectAtIndex:row]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - self.indexSelectedBeforeDismissal = row; + [self.selectedIndexes replaceObjectAtIndex:component withObject:[NSNumber numberWithInt:row]]; } @end diff --git a/ModalPickerDemo/ModalPickerDemo/ViewController.h b/ModalPickerDemo/ModalPickerDemo/ViewController.h index 9a93cfd..680b10e 100644 --- a/ModalPickerDemo/ModalPickerDemo/ViewController.h +++ b/ModalPickerDemo/ModalPickerDemo/ViewController.h @@ -11,8 +11,10 @@ @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *dateLabel; +@property (weak, nonatomic) IBOutlet UILabel *multiLabel; - (IBAction)onSelectColor:(id)sender; - (IBAction)onSelectDate:(id)sender; +- (IBAction)onSelectMulti:(id)sender; @end diff --git a/ModalPickerDemo/ModalPickerDemo/ViewController.m b/ModalPickerDemo/ModalPickerDemo/ViewController.m index b7d71d1..59576ac 100644 --- a/ModalPickerDemo/ModalPickerDemo/ViewController.m +++ b/ModalPickerDemo/ModalPickerDemo/ViewController.m @@ -12,6 +12,7 @@ @interface ViewController () { NSInteger _lastSelectedIndex; + NSMutableArray* _lastSelectedIndexes; } @end @@ -20,6 +21,7 @@ @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; + _lastSelectedIndexes = [[NSMutableArray alloc] init]; } - (IBAction)onSelectColor:(id)sender { @@ -62,4 +64,31 @@ - (IBAction)onSelectDate:(id)sender { }]; } +- (IBAction)onSelectMulti:(id)sender { + NSArray *names = @[ + @[ + @"John", + @"Jane", + @"Bob", + @"Barbera" + ], + @[ + @"Smith", + @"Doe", + @"Jones" + ] + ]; + + BSModalPickerView *pickerView = [[BSModalPickerView alloc] initWithValues:names]; + pickerView.selectedIndexes = _lastSelectedIndexes; + [pickerView presentInView:self.view + withBlock:^(BOOL madeChoice) { + if (madeChoice) { + _lastSelectedIndexes = pickerView.selectedIndexes; + self.multiLabel.text = [pickerView.selectedValues componentsJoinedByString:@" "]; + } + }]; + +} + @end diff --git a/ModalPickerDemo/ModalPickerDemo/en.lproj/ViewController.xib b/ModalPickerDemo/ModalPickerDemo/en.lproj/ViewController.xib index 6356121..1dd01d3 100644 --- a/ModalPickerDemo/ModalPickerDemo/en.lproj/ViewController.xib +++ b/ModalPickerDemo/ModalPickerDemo/en.lproj/ViewController.xib @@ -1,457 +1,85 @@ - - - - 1552 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - IBNSLayoutConstraint - IBProxyObject - IBUIButton - IBUILabel - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 292 - {{195, 86}, {105, 44}} - - - _NS:9 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Select Date - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{20, 86}, {112, 44}} - - - _NS:9 - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Select Color - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - 292 - {{20, 170}, {280, 34}} - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - (select a date) - - 1 - MC4yNzM2MDE1MTc0IDAuNDI5NTgxMzUxOSAwLjMzNzc4NDA2NDgAA - - - 0 - 1 - - 2 - 21 - - - Helvetica-Bold - 21 - 16 - - NO - - - {{0, 20}, {320, 548}} - - - - 1 - MC41MDYwNDg3MzgxIDAuNzUgMC42MTQ2NDk1OTQ1AA - - NO - - - IBUIScreenMetrics - - YES - - - - - - {320, 568} - {568, 320} - - - IBCocoaTouchFramework - Retina 4 Full Screen - 2 - - IBCocoaTouchFramework - - - - - - - view - - - - 7 - - - - dateLabel - - - - 37 - - - - onSelectDate: - - - 7 - - 36 - - - - onSelectColor: - - - 7 - - 35 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 170 - - 1000 - - 3 - 9 - 3 - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 86 - - 1000 - - 3 - 9 - 3 - - - - 11 - 0 - - 11 - 1 - - 0.0 - - 1000 - - 6 - 24 - 2 - - - - - - - - - 8 - - - - - 13 - - - - - 17 - - - - - 18 - - - - - 19 - - - - - 21 - - - - - 22 - - - - - 8 - 0 - - 0 - 1 - - 34 - - 1000 - - 3 - 9 - 1 - - - - - - 31 - - - - - 29 - - - - - 28 - - - - - 23 - - - - - - - ViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - 37 - - - 0 - IBCocoaTouchFramework - YES - 3 - YES - 2083 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file