iOS基础-UIKit框架-高级视图-UIPickerView-实例2:城市选择(列与列之间有关系)

说明:事先已经准备好了一个NJProvince类,里面声明了2个属性name和cities,并创建和实现了快速创建对象的动态方法和静态方法。直接导入即可。
创建一个plist文件,Root为Array,里面为字典(字典里为省份和城市)
加载这个plist文件

@property(nonatomic,strong)NSArray *provinces;
-(NSArray *)provinces
{
  if(_provinces == nil){
  // 加载资源
  NSArray *array = [NSArray arrayWithContentsOfFile:[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil]];
  //将字典转换为模型
  NSMutableArray *models = [NSMutableArray  arrayWithCapacity:array.count];

for(NSDcitionary *dict in array){
  NJProvince *province = [NJProvince provinceWithDictionary:dict];
  [models addObject:province];
   }
   _provinces = [models copy];
  }
   return _provinces;
}
-(void)viewDidLoad

{

   [super viewDidLoad];

//1.创建pickerview
//pickerView 有默认的frame
UIPickerView = *pickerView = [UIPickerView alloc] init];
//2.设置数据源和代理为控制器(并实现相关协议)
pickerView.dataSource = self;
pickerView.delegate = self;
[self.view addSubview:pickerView];
self.pickerView = pickerView  //具体添加原因看下面

}

实现数据源方法和代理方法

#pragma mark - 数据源方法
//告诉系统有多少列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
   return 2;
}

注意:为了得到pickView,先添加一个UIPickerView属性,并在viewDidLoad中给这个属性赋值self.pickerView = pickerView;
//告诉系统有多少行
-(NSInteger)pickerView:(UIPickerView *)pickerView  numberOfRowsInComponents:(NSInteger)component
{
   if0 == component){
  //省份
  return self.provinces.count;
} else { //城市
//0.获取第0列选中的行
NSInteger selectIndex = [self.pickerView selectedRowInComponent:0];
//1.根据第0列选中的行数获取对应省份(获取第一列选中行的模型)
NJProvince *province = self.provinces[selectIndex];
//2.获取对应省份的对应城市
NSArray *cities = province.cities;
//3.返回城市的个数
    return cities.count;
  }
}

#pragma mark - 代理方法
//告诉系统每一行显示什么内容
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponents:(NSInteger)component
{
    if0 == component){
//省份
return [self.provinces[row] name];
} else { //城市
//0.获取第0列选中的行 
NSInteger selectIndex = [pickerView selectedRowInComponent:0]; 
//1.获取对应的省份
NJProvince *province = self.provinces[selectIndex];
//2.获取对应的城市
     return province.cities[row];
   }
}

根据选中的省份显示出对应的城市

//监听pickerView的选中
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//判断是否修改了第0列(省份列)
if0 == component){
//刷新第1列对应的数据
pickerVIew reloadComponent:1];
//让第1列滚动到第0行
[pickerView selectRow:0 inComponent:1 animated:YES];
}
原文地址:https://www.cnblogs.com/marshall-yin/p/4721291.html