#import "YXDependentComponentPickerViewController.h" #define kStateComponent 0 #define kZipComponent 1 @interface YXDependentComponentPickerViewController () <UIPickerViewDataSource,UIPickerViewDelegate> @property (weak,nonatomic) IBOutlet UIPickerView *DependentPicker; - (IBAction)buttonPress:(UIButton *)sender; /** <#type#>*/ @property (nonatomic,strong) NSDictionary *stateZip; // dict /** <#type#>*/ @property (nonatomic,strong) NSArray *states; // keys /** <#type#>*/ @property (nonatomic,strong) NSArray *zips; // values // 字典中包含n个数组 // stateZip allKeys - > states // stateZip key -> value : states @end @implementation YXDependentComponentPickerViewController - (NSArray *)states { if (_states == nil) { NSMutableArray *keyTmp = [[NSMutableArray alloc] init]; NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; for (int i = 0; i < 26; i++) { char ch = 'A' + i; Nsstring *key = [Nsstring stringWithFormat:@"%c",ch]; [keyTmp addobject:key]; NSMutableArray *tmpArr = [[NSMutableArray alloc] init]; for (int j = 0; j < 10; j++) { [tmpArr addobject:[Nsstring stringWithFormat:@"%@---%d",key,j]]; } [dict setobject:tmpArr forKey:key]; } self.stateZip = dict; self.states = keyTmp; } return _states; } - (void)viewDidLoad { [super viewDidLoad]; Nsstring *selectedState = self.states[0]; // 字典中第1个key -- A self.zips = self.stateZip[selectedState]; } - (IBAction)buttonPress:(UIButton *)sender { // 根据位置获取数据 NSInteger stateRow = [self.DependentPicker selectedRowInComponent:kStateComponent]; NSInteger zipRow = [self.DependentPicker selectedRowInComponent:kZipComponent]; Nsstring *state = self.states[stateRow]; Nsstring *zip = self.zips[zipRow]; Nsstring *title = [[Nsstring alloc] initWithFormat:@"You selected zip code %@",zip]; Nsstring *message = [[Nsstring alloc] initWithFormat:@"%@ is in %@",zip,state]; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil,nil]; [alertView show]; } #pragma mark - #pragma mark picker data source methods - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == kStateComponent) { return self.states.count; } return self.zips.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[row]; } /** * 只要选择器的选择发生了变化,就会调用这个方法,在这个方法中检查component参数可以知道发生变化的是否是左侧的滚轮,如果确实是左侧的滚轮发生了变化,那么右侧的内容也会跟着发生变化。 * */ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (component == kStateComponent) { Nsstring *selectedState = self.states[row]; self.zips = self.stateZip[selectedState]; [self.DependentPicker reloadComponent:kZipComponent]; // [self.DependentPicker reloadAllComponents]; [self.DependentPicker selectRow:0 inComponent:kZipComponent animated:YES]; } } - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { if (component == kZipComponent) { return 90.0f; } return 200.f; } @end