Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions BSModalPickerView/BSModalPickerView.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,21 @@

@interface BSModalPickerView : BSModalPickerBase <UIPickerViewDelegate, UIPickerViewDataSource>

@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
112 changes: 88 additions & 24 deletions BSModalPickerView/BSModalPickerView.m
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
2 changes: 2 additions & 0 deletions ModalPickerDemo/ModalPickerDemo/ViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
29 changes: 29 additions & 0 deletions ModalPickerDemo/ModalPickerDemo/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

@interface ViewController () {
NSInteger _lastSelectedIndex;
NSMutableArray* _lastSelectedIndexes;
}

@end
Expand All @@ -20,6 +21,7 @@ @implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
_lastSelectedIndexes = [[NSMutableArray alloc] init];
}

- (IBAction)onSelectColor:(id)sender {
Expand Down Expand Up @@ -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
Loading