iOS9使用UIPickerView地點(diǎn)選擇器
最近公司在做類似淘寶添加地址的位置選擇器,研究了一下,下面把實(shí)現(xiàn)過(guò)程分享出來(lái)提针。
1.首先演示下效果:
Simulator Screen Shot 2016年5月27日 上午11.52.27.png
Simulator Screen Shot 2016年5月27日 上午11.52.32.png
2.下面說(shuō)下實(shí)現(xiàn)過(guò)程:
- 1.UIPickerView的用戶和TableView有點(diǎn)類似爬迟,都是通過(guò)實(shí)現(xiàn)代理方法和數(shù)據(jù)源方法實(shí)現(xiàn)的過(guò)程:UIPickerViewDataSource, UIPickerViewDelegate
- 2.數(shù)據(jù)源方法主要有三個(gè),分別是設(shè)置有多少列驹溃,每列有多少行,每行的標(biāo)題,下面詳見(jiàn)代碼:
// 1.設(shè)置列的返回?cái)?shù)量
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;
}
// 2.設(shè)置列里邊組件的個(gè)數(shù) component:組件
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
//如果是第一列
if (component == 0)
{
//返回省的個(gè)數(shù)
return self.provinceArray.count;
}
//如果是第二列
else if (component == 1)
{
//返回市的個(gè)數(shù)
return self.cityArray.count;
}
else
{
//返回縣區(qū)的個(gè)數(shù)
return self.countyArray.count;
}
}
// 3.返回組件的標(biāo)題
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) {
// 設(shè)置第0列的標(biāo)題信息
NSDictionary *provinceDict = [self.provinceArray objectAtIndex:row];
NSString *name = provinceDict[@"n"];
return name;
} else if (component == 1) {
// 設(shè)置第1列的標(biāo)題信息
NSDictionary *cityDict = [self.cityArray objectAtIndex:row];
NSString *name = cityDict[@"n"];
return name;
} else {
// 設(shè)置第2列的標(biāo)題信息
NSDictionary *countryDict = [self.countyArray objectAtIndex:row];
NSString *name = countryDict[@"n"];
return name;
}
}
- 3.這里數(shù)據(jù)我是放在本地的延曙,里面就是JSON文件豌鹤,我們將它轉(zhuǎn)換成數(shù)組或字典格式就行:
#pragma mark - 加載數(shù)據(jù)
- (void)loadData
{
// 從MainBundle中加載文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"citylist" ofType:@"data"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSArray *jsonArray = [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingAllowFragments
error:nil];
// 取出默認(rèn)的省市信息
self.provinceArray = jsonArray;
// 取出默認(rèn)的城市信息
NSDictionary *provinceDict = [self.provinceArray firstObject];
self.cityArray = provinceDict[@"l"];
// 取出默認(rèn)的區(qū)信息
NSDictionary *cityDict = [self.cityArray firstObject];
self.countyArray = cityDict[@"l"];
}
- 4.這里非常重要的一點(diǎn)就是,當(dāng)我們選擇某一列的某一行時(shí)枝缔,其他兩級(jí)需要刷新數(shù)據(jù)布疙,比如我們選中浙江省,那么對(duì)應(yīng)市和對(duì)應(yīng)區(qū)的數(shù)據(jù)需要刷新愿卸,下面詳見(jiàn)代碼:
//選擇器選擇的方法 row:被選中的行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
//選擇第0列執(zhí)行的方法
if (component == 0) {
[pickerView selectedRowInComponent:0];
/**
* 選中第0列時(shí)需要刷新第1列和第二列的數(shù)據(jù)
*/
NSDictionary *provinceDict = [self.provinceArray objectAtIndex:row];
self.cityArray = provinceDict[@"l"];
[pickerView reloadComponent:1];
NSDictionary *cityDict = [self.cityArray firstObject];
self.countyArray = cityDict[@"l"];
[pickerView reloadComponent:2];
} else if (component == 1) {
[pickerView selectedRowInComponent:1];
/**
* 選中第一列時(shí)需要刷新第二列的數(shù)據(jù)信息
*/
NSDictionary *cityDict = [self.cityArray objectAtIndex:row];
self.countyArray = cityDict[@"l"];
[pickerView reloadComponent:2];
} else if (component == 2) {
[pickerView selectedRowInComponent:2];
}
}
- 5.到這里主要實(shí)現(xiàn)就已經(jīng)完成了灵临,我給TextField的輸出視圖加了個(gè)ToolBar,作為選中結(jié)果的確認(rèn):
// 作為T(mén)extField的彈出視圖的工具條
- (UIToolbar *)toolbar
{
if (_toolbar == nil) {
_toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 49)];
UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStylePlain target:self action:@selector(cancel)];
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *certain = [[UIBarButtonItem alloc] initWithTitle:@"確定" style:UIBarButtonItemStylePlain target:self action:@selector(certain)];
_toolbar.items = @[cancel,flexibleSpace,certain];
}
return _toolbar;
}
// 點(diǎn)擊了取消
- (void)cancel
{
[self.textField resignFirstResponder];
}
// 點(diǎn)擊了確定
- (void)certain
{
// 獲取當(dāng)前選中的信息
NSInteger proviceIndex = [self.pickerView selectedRowInComponent:0];
NSInteger cityIndex = [self.pickerView selectedRowInComponent:1];
NSInteger countryIndex = [self.pickerView selectedRowInComponent:2];
NSString *provice = self.provinceArray[proviceIndex][@"n"];
NSString *city = self.cityArray[cityIndex][@"n"];
NSString *country = self.countyArray[countryIndex][@"n"];
NSLog(@"%@,%@,%@",provice,city,country);
// 彈出提示
NSString *message = [NSString stringWithFormat:@"您選擇的是:%@-%@-%@",provice,city,country];
UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertVc addAction:cancel];
[self presentViewController:alertVc animated:YES completion:nil];
}
3.示例代碼中我已經(jīng)對(duì)UIPickerView做了封裝趴荸,單獨(dú)抽取在CWPickerView類中儒溉,調(diào)用時(shí)直接初始化UIPickerView即可:
- 調(diào)用CWPickerView
CWPickerView *pickerView = [[CWPickerView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)];
self.pickerView = pickerView;
// 將pickerView作為UITextFiled的輸出View
self.textField.inputView = pickerView;
- 取出當(dāng)前選中的省市縣列表,這里我提供了一個(gè)對(duì)象方法獲取當(dāng)前選中的列表,返回的是一個(gè)字典
// 獲取當(dāng)前選中的信息
NSDictionary *info = [self.pickerView getCurrentSelectedInfo];
// 獲取當(dāng)前選中的信息
NSString *provice = info[@"province"];
NSString *city = info[@"city"];
NSString *country = info[@"country"];
// 彈出提示
NSString *message = [NSString stringWithFormat:@"您選擇的是:%@-%@-%@",provice,city,country];