Ok, so I'm trying to have an app with a custom date picker. Instead of the dates being: 1, 2, 3, 4, 5, etc, it would be: 1, 8, 15, 22, etc.
This is the picker component I'm talking about:
So, I thought I could do a dependent picker with 3 components, getting the data source from a plist. The problem is I only know how to do that with 2 components. Here's what I have: (state is the first component, zip is the second, and test is the third.)
Here's my PickerViewController.h
Here's my PickerViewController.m
This is the picker component I'm talking about:

So, I thought I could do a dependent picker with 3 components, getting the data source from a plist. The problem is I only know how to do that with 2 components. Here's what I have: (state is the first component, zip is the second, and test is the third.)
Here's my PickerViewController.h
Code:
#import <UIKit/UIKit.h>
#define kStateComponent 0
#define kZipComponent 1
#define kTestComponent 2
@interface DependentComponentPickerViewController : UIViewController
<UIPickerViewDelegate, UIPickerViewDataSource>
{
IBOutlet UIPickerView *picker;
NSDictionary *stateZips;
NSArray *states;
NSArray *zips;
NSArray *tests;
}
@property (nonatomic, retain) UIPickerView *picker;
@property (nonatomic, retain) NSDictionary *stateZips;
@property (nonatomic, retain) NSArray *states;
@property (nonatomic, retain) NSArray *zips;
@property (nonatomic, retain) NSArray *tests;
-(IBAction)buttonPressed;
@end
Here's my PickerViewController.m
Code:
#import "DependentComponentPickerViewController.h"
@implementation DependentComponentPickerViewController
@synthesize picker;
@synthesize stateZips;
@synthesize states;
@synthesize zips;
@synthesize tests;
-(IBAction)buttonPressed
{
NSInteger stateRow = [picker selectedRowInComponent:kStateComponent];
NSInteger zipRow = [picker selectedRowInComponent:kZipComponent];
NSInteger testRow = [picker selectedRowInComponent:kTestComponent];
NSString *state = [self.states objectAtIndex:stateRow];
NSString *zip = [self.zips objectAtIndex:zipRow];
NSString *test = [self.tests objectAtIndex:testRow];
NSString *title = [[NSString alloc] initWithFormat:@"You selected zip code %@.", zip];
NSString *message = [[NSString alloc] initWithFormat:@"%@ is in %@", zip, state];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[title release];
[message release];
}
-(void)viewDidLoad {
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc]
initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];
NSArray *components = [self.stateZips allKeys];
NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
self.states = sorted;
NSString *selectedState = [self.states objectAtIndex:0];
NSArray *array = [stateZips objectForKey:selectedState];
self.zips = array;
}
- (void)dealloc {
[picker release];
[stateZips release];
[zips release];
[tests release];
[super dealloc];
}
#pragma mark -
#pragma mark Picker Date Source Methods
- (NSInteger)numberOfComponentsInPickerView: (UIPickerView *)pickerView
{
return 3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
if (component == kStateComponent)
return [self.states count];
return [self.zips count];
return [self.tests count];
}
#pragma mark Picker Delegate Methods
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
{
if (component == kStateComponent)
return [self.states objectAtIndex:row];
return [self.zips objectAtIndex:row];
return [self.tests objectAtIndex:row];
}
-(void)pickerView:(UIPickerView *)pickerView
didSelectRow:(NSInteger)row
inComponent:(NSInteger)component
{
if (component ==kStateComponent)
{
NSString *selectedState = [self.states objectAtIndex:row];
NSArray *array = [stateZips objectForKey:selectedState];
self.zips = array;
[picker selectRow:0 inComponent:kZipComponent animated:YES];
[picker reloadComponent:kZipComponent];
self.tests = array;
[picker selectedRow:0 inComponent:kTestComponent animated:YES];
[picker reloadComponent:kTestComponent];
}
}
@end