源码下载地址:http://download.csdn.net/detail/liu537192/8515579
效果图:
核心代码:
//
// JLViewController.m
// 03-省份城市联动
//
// Created by XinYou on 15-3-10.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLViewController.h"
#import "JLProvince.h"
@interface JLViewController ()
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
/**
* 用于显示当前选中的省份和城市的label
*/
@property (weak, nonatomic) IBOutlet UILabel *provinceAndCityLabel;
@property (nonatomic, strong)NSArray *provinces;
@end
@implementation JLViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 设置数据源
self.pickerView.dataSource = self;
// 设置代理
self.pickerView.delegate = self;
// 主动调用代理方法,设置pickView默认选中第0列第0行
[self pickerView:nil didSelectRow:0 inComponent:0];
}
- (NSArray *)provinces{
if (_provinces == nil) {
// 获取plist文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil];
// 加载plist文件的内容到数组
NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *tempArray = [NSMutableArray array];
// 数组转模型
for (NSDictionary *dict in dictArray) {
JLProvince *province = [JLProvince provinceWithDict:dict];
[tempArray addObject:province];
}
_provinces = tempArray;
}
return _provinces;
}
#pragma mark -数据源方法
/**
* pickerView共有多少列
*/
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
/**
* pickerView第component列有多少行
*/
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if (0 == component) {
return self.provinces.count;
}
// 获得第0列当前选中的行号
int zeroRow = [self.pickerView selectedRowInComponent:0];
// 根据行号确定省份
JLProvince *province = self.provinces[zeroRow];
// 根据省份确定第1列城市的数量
return province.cities.count;
}
#pragma mark -代理方法
/**
* pickerView第component列的第row行显示的字符串
*/
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (0 == component) {
JLProvince *province = self.provinces[row];
return province.name;
}
// 获得第0列当前选中的行号
int zeroRow = [self.pickerView selectedRowInComponent:0];
// 根据行号确定省份
JLProvince *province = self.provinces[zeroRow];
// 根据省份确定第1列要显示的城市
return province.cities[row];
}
/**
* 当选中了pickerView的第component列的第row行会调用这个方法
*/
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
// 如果第0列有变化,就要刷新第1列的数据,并且让第1列选中第0行
if (0 == component) {
// 刷新第1列(因为第1列是根据第0列显示的省份来显示不同的城市)
[self.pickerView reloadComponent:1];
[self.pickerView selectRow:0 inComponent:1 animated:YES];
}
// 获得第0列当前选中的行号
int zeroRow = [self.pickerView selectedRowInComponent:0];
// 根据行号确定省份
JLProvince *province = self.provinces[zeroRow];
// 获取省份名
NSString *provinceName = province.name;
// 获得第1列当前选中的行号
int firstRow = [self.pickerView selectedRowInComponent:1];
// 根据行号获取城市名
NSString *cityName = province.cities[firstRow];
self.provinceAndCityLabel.text = [NSString stringWithFormat:@"%@--%@", provinceName, cityName];
}
@end
//
// JLProvince.h
// 03-省份城市联动
//
// Created by XinYou on 15-3-10.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
@interface JLProvince : NSObject
/**
* 省份名称
*/
@property (nonatomic, copy)NSString *name;
/**
* 该省中所有的城市
*/
@property (nonatomic, strong)NSArray *cities;
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)provinceWithDict:(NSDictionary *)dict;
@end
//
// JLProvince.m
// 03-省份城市联动
//
// Created by XinYou on 15-3-10.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLProvince.h"
@implementation JLProvince
- (instancetype)initWithDict:(NSDictionary *)dict{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)provinceWithDict:(NSDictionary *)dict{
return [[self alloc] initWithDict:dict];
}
@end