diff --git a/Pod/Classes/DownPicker.h b/Pod/Classes/DownPicker.h index 89f62c6..9141023 100644 --- a/Pod/Classes/DownPicker.h +++ b/Pod/Classes/DownPicker.h @@ -11,11 +11,14 @@ #import +@protocol DownPickerDataSource; +@protocol DownPickerDelegate; + @interface DownPicker : UIControl { UIPickerView* pickerView; IBOutlet UITextField* textField; - NSArray* dataArray; + NSMutableArray* dataArray; NSString* placeholder; NSString* placeholderWhileSelecting; NSString* toolbarDoneButtonText; @@ -25,6 +28,11 @@ @property (nonatomic) NSString* text; @property (nonatomic) NSInteger selectedIndex; +@property (strong, nonatomic) id delegate; +@property (strong, nonatomic) id dataSource; + +- (instancetype) initWithTextField: (UITextField *) uiTextField AndDataSource: (id) dataSource; +- (void) reloadData; -(id)initWithTextField:(UITextField *)tf; -(id)initWithTextField:(UITextField *)tf withData:(NSArray*) data; @@ -65,8 +73,22 @@ /** Sets the zero-based index of the selected item: -1 can be used to clear selection. - @return - The value at the given index or NIL if nothing has been selected yet. */ -(void) setValueAtIndex:(NSInteger)index; @end + +@protocol DownPickerDataSource + +- (NSInteger) numberOfItemsForDownPicker: (DownPicker *) picker; +- (NSString *) downPicker: (DownPicker *) picker textForIndex: (NSInteger) index; + +@end + +@protocol DownPickerDelegate + +@optional +- (void) downPicker: (DownPicker *) picker didSelectItemAtIndex: (NSInteger) index; +- (void) downPicker: (DownPicker *) picker didPickedItemAtIndex: (NSInteger) index; +- (void) downPickerDidCancelSelection: (DownPicker *) picker; + +@end diff --git a/Pod/Classes/DownPicker.m b/Pod/Classes/DownPicker.m index 665c667..45cb363 100644 --- a/Pod/Classes/DownPicker.m +++ b/Pod/Classes/DownPicker.m @@ -67,6 +67,52 @@ -(id)initWithTextField:(UITextField *)tf withData:(NSArray*) data return self; } +- (instancetype) initWithTextField: (UITextField *) uiTextField AndDataSource: (id) dataSource +{ + self = [self initWithTextField:uiTextField]; + if (self) + { + self.dataSource = dataSource; + if ([self.dataSource respondsToSelector:@selector(numberOfItemsForDownPicker:)] && [self.dataSource respondsToSelector:@selector(downPicker:textForIndex:)]) + { + NSInteger numberOfItems = [self.dataSource numberOfItemsForDownPicker:self]; + if (!dataArray) + dataArray = [[NSMutableArray alloc] init]; + [dataArray removeAllObjects]; + for (int i = 0; i < (int) numberOfItems; i++) + { + [dataArray addObject:[self.dataSource downPicker:self textForIndex:i]]; + } + } + else + { + NSException *invalidArgumentException = [NSException exceptionWithName:NSInvalidArgumentException reason:@"Data Source must implement numberOfItems and textForIndex methods." userInfo:nil]; + [invalidArgumentException raise]; + } + } + return self; +} + +- (void) reloadData +{ + if ([self.dataSource respondsToSelector:@selector(numberOfItemsForDownPicker:)] && [self.dataSource respondsToSelector:@selector(downPicker:textForIndex:)]) + { + NSInteger numberOfItems = [self.dataSource numberOfItemsForDownPicker:self]; + if (!dataArray) + dataArray = [[NSMutableArray alloc] init]; + [dataArray removeAllObjects]; + for (int i = 0; i < (int) numberOfItems; i++) + { + [dataArray addObject:[self.dataSource downPicker:self textForIndex:i]]; + } + } + else + { + NSException *invalidArgumentException = [NSException exceptionWithName:NSInvalidArgumentException reason:@"Data Source must implement numberOfItems and textForIndex methods." userInfo:nil]; + [invalidArgumentException raise]; + } +} + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -82,6 +128,11 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp { self->textField.text = [dataArray objectAtIndex:row]; [self sendActionsForControlEvents:UIControlEventValueChanged]; + + if ([self.delegate respondsToSelector:@selector(downPicker:didSelectItemAtIndex:)]) + { + [self.delegate downPicker:self didSelectItemAtIndex:row]; + } } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component; @@ -112,6 +163,11 @@ -(void)doneClicked:(id) sender } */ [self sendActionsForControlEvents:UIControlEventValueChanged]; + + if ([self.delegate respondsToSelector:@selector(downPicker:didPickedItemAtIndex:)]) + { + [self.delegate downPicker:self didPickedItemAtIndex:[self selectedIndex]]; + } } -(void)cancelClicked:(id)sender @@ -121,6 +177,11 @@ -(void)cancelClicked:(id)sender self->textField.placeholder = self->placeholder; } self->textField.text = _previousSelectedString; + + if ([self.delegate respondsToSelector:@selector(downPickerDidCancelSelection:)]) + { + [self.delegate downPickerDidCancelSelection:self]; + } } @@ -197,7 +258,8 @@ - (void)textFieldDidBeginEditing:(UITextField *)textField [self sendActionsForControlEvents:UIControlEventEditingDidBegin]; } -- (void)textFieldDidEndEditing:(UITextField *)aTextField { +- (void) textFieldDidEndEditing: (UITextField *) aTextField +{ // [self doneClicked:aTextField]; aTextField.userInteractionEnabled = YES; [self sendActionsForControlEvents:UIControlEventEditingDidEnd]; @@ -208,18 +270,19 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang return NO; } --(void) setData:(NSArray*) data +-(void) setData: (NSMutableArray *) data { dataArray = data; } --(void) showArrowImage:(BOOL)b +-(void) showArrowImage: (BOOL) showArrow { - if (b == YES) { - // set the DownPicker arrow to the right (you can replace it with any 32x24 px transparent image: changing size might give different results) + if (showArrow == YES) + { self->textField.rightViewMode = UITextFieldViewModeAlways; } - else { + else + { self->textField.rightViewMode = UITextFieldViewModeNever; } } @@ -277,7 +340,10 @@ -(NSString*) getValueAtIndex:(NSInteger)index -(void) setValueAtIndex:(NSInteger)index { - if (index >= 0) [self pickerView:nil didSelectRow:index inComponent:0]; + if (pickerView && index >= 0) + { + [self pickerView:pickerView didSelectRow:index inComponent:0]; + } else [self setText:nil]; }