IOS之简单选择器UIPickerView(省份+城市)

        先介绍一下我们要实现什么功能。有1个选择器,有左右两个轮子,做轮子选择省份,右轮子选择城市,其中选择省份时,右边的城市会自动更新。


 

1、首先,对UIPickerView绑定Delegate和DataSource到相应的ViewController。此处不再赘述。可以用代码或者Interface界面设置。

2、首先实现数据的初始化。

(1)在.h文件中定义如下变量。其中provinces_cities.plist请见附件。

@interface IkrboyViewController : UIViewController{
    NSDictionary *dict;//用于存储省份-城市的数据
    NSArray *provinceArray;//省份的数组
    NSArray *cityArray;//城市的数组,在接下来的代码中会有根据省份的选择进行数据更新的操作
}

 (2)在.m的viewDidLoad方法中加上初始化数据的处理。具体处理在initPicker方法
 

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    [self initPicker];
}

//初始化PickerView使用的数据源
-(void)initPicker{
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *plistPath = [bundle pathForResource:@"provinces_cities" ofType:@"plist"];
    dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
    provinceArray = [dict allKeys];
   
    NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];
    NSString *seletedProvince = [provinceArray objectAtIndex:selectedProvinceIndex];
    cityArray = [dict objectForKey:seletedProvince];
    NSLog(@"%d",[provinceArray count]);
}

 3、将数据绑定到UIPickerView

//以下3个方法实现PickerView的数据初始化
//确定picker的轮子个数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
	return 2;
}
//确定picker的每个轮子的item数
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
	if (component == 0) {//省份个数
		return [provinceArray count];
	} else {//市的个数
        return [cityArray count];
	}
}
//确定每个轮子的每一项显示什么内容
#pragma mark 实现协议UIPickerViewDelegate方法
-(NSString *)pickerView:(UIPickerView *)pickerView
			titleForRow:(NSInteger)row forComponent:(NSInteger)component {
	if (component == 0) {//选择省份名
		return [provinceArray objectAtIndex:row];
	} else {//选择市名
        return [cityArray objectAtIndex:row];
	}
}

 4.随时监听UIPickerView的滚动。

//监听轮子的移动
- (void)pickerView:(UIPickerView *)pickerView
	  didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
	if (component == 0) {
		NSString *seletedProvince = [provinceArray objectAtIndex:row];
        cityArray = [dict objectForKey:seletedProvince];
        
        //重点!更新第二个轮子的数据
         [self.pickerView reloadComponent:1];
        
        NSInteger selectedCityIndex = [self.pickerView selectedRowInComponent:1];
        NSString *seletedCity = [cityArray objectAtIndex:selectedCityIndex];
		
        NSString *msg = [NSString stringWithFormat:@"province=%@,city=%@", seletedProvince,seletedCity];
        NSLog(@"%@",msg);
	}
    else {
        NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];
        NSString *seletedProvince = [provinceArray objectAtIndex:selectedProvinceIndex];
        
        NSString *seletedCity = [cityArray objectAtIndex:row];
        NSString *msg = [NSString stringWithFormat:@"province=%@,city=%@", seletedProvince,seletedCity];
        NSLog(@"%@",msg);
    }
}

 附加说明:利用下面的代码,获得UIPickerView的不同Component(滚轮)的选中的index。

    NSInteger selectedProvinceIndex = [self.pickerView selectedRowInComponent:0];
    NSInteger selectedCityIndex = [self.pickerView selectedRowInComponent:1];

 

/** * 只显示省份一级 * provinceBlock : 回调省份 */ (instancetype)provincePickerViewWithProvinceBlock:(void(^)(NSString *province))provinceBlock; /** * 显示省份和市级 * cityBlock : 回调省份城市 */ (instancetype)cityPickerViewWithCityBlock:(void(^)(NSString *province, NSString *city))cityBlock; /** * 显示省份和市级和区域 * areaBlock : 回调省份城市和区域 */ (instancetype)areaPickerViewWithAreaBlock:(void(^)(NSString *province, NSString *city, NSString *area))areaBlock; /** * 只显示省份一级 * province : 传入了省份自动滚动到省份,没有传或者找不到默认选中第一个 * provinceBlock : 回调省份 */ (instancetype)provincePickerViewWithProvince:(NSString *)province provinceBlock:(void(^)(NSString *province))provinceBlock; /** * 显示省份和市级 * province,city : 传入了省份城市自动滚动到选中的,没有传或者找不到默认选中第一个 * cityBlock : 回调省份城市 */ (instancetype)cityPickerViewWithProvince:(NSString *)province city:(NSString *)city cityBlock:(void(^)(NSString *province, NSString *city))cityBlock; /** * 显示省份和市级和区域 * province,city : 传入了省份城市和区域自动滚动到选中的,没有传或者找不到默认选中第一个 * areaBlock : 回调省份城市和区域 */ (instancetype)areaPickerViewWithProvince:(NSString *)province city:(NSString *)city area:(NSString *)area areaBlock:(void(^)(NSString *province, NSString *city, NSString *area))areaBlock;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值