//模型层定义
#import <Foundation/Foundation.h>
@interface CityModel : NSObject
@property (nonatomic, copy) NSString *proName;
@property (nonatomic, strong) NSArray *cities;
@end
//实现
#import "ViewController.h"
#import "CityModel.h"
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *proArr;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.flag_Zu=YES;
UIPickerView *pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 350, 0, 0)];
pickerView.delegate = self;
pickerView.dataSource = self;
pickerView.showsSelectionIndicator = YES;
[self.view addSubview:pickerView];
self.proArr = [NSMutableArray arrayWithCapacity:0];
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"city" ofType:@"plist"];
NSArray *cityArr = [[NSArray alloc]initWithContentsOfFile:path];
for (NSDictionary *dic in cityArr) {
CityModel *model = [[CityModel alloc]init];
model.cities = [dic objectForKey:@"cities"];
model.proName = [dic objectForKey:@"state"];
[self.proArr addObject:model];
}
}
//返回组数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
// 返回组中的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) {
return self.proArr.count;
}else{
//返回第一列选择行的索引
NSInteger selectedRow = [pickerView selectedRowInComponent:0];
CityModel *model = [self.proArr objectAtIndex:selectedRow];
return model.cities.count;
}
}
//返回每个item中的title
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) {
CityModel *model = [self.proArr objectAtIndex:row];
self.flag_Zu=NO;
return model.proName;
}else {
NSInteger selectedRow = [pickerView selectedRowInComponent:0];
CityModel *model = [self.proArr objectAtIndex:selectedRow];
if(self.flag_Zu)
return [model.cities objectAtIndex:row];
else
return [model.cities objectAtIndex:0];
}
}
//设置列的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
if (component == 0) {
return 100;
}
return 220;
}
//选择行的事件
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if (component == 0) {
self.flag_Zu=YES;
//刷新指定列中的行
[pickerView reloadComponent:1];
//选择指定的item
[pickerView selectRow:0 inComponent:1 animated:YES];
}
}
在这个过程中遇到的问题就是当第一列没停止的时候,去华东第二列,程序很容易崩溃。解决的方法就是就是加个BOOL变量去判断一下
效果如下图所示: