博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS:城市级联列表的使用
阅读量:6963 次
发布时间:2019-06-27

本文共 7027 字,大约阅读时间需要 23 分钟。

1、介绍:

现在越来越多的项目都用到了地址,尤其是电商O2O的购物平台,我之前做的教育产品和电商产品都用到了,而实现地址的设置用到的技术就是城市级联列表,即普遍的做法就是自定义选择器控件UIPickerView,然后从本地整理的城市plist文件获取省份、城市、县镇三级级联。现在整理一下,分享给大家。

 

2、效果图如下:

 

3、用法:

(1)导入本地城市级联文件:

(2)导入DDMeZonePickerView.h头文件,在控制器通过[UIView Animation]的动画控制创建的DDMeZonePickerView视图对象的frame让其显示或隐藏即可,被选择的城市然后通过block进行回传。

 

4、废话不多说,实现代码如下:

DDMeZonePickerView.h

//  DDMeZonePickerView.h//  BiaoJiePay////  Created by 夏远全 on 16/11/19.//  Copyright © 2016年 广州东德科技. All rights reserved.//#import 
/** * 声明block */typedef void (^adressBlock)(NSString *adress);@interface DDMeZonePickerView : UIView/** * 定义block属性 */@property (copy,nonatomic)adressBlock adressBlock;/** * 传递地址 */-(void)chooseAdressBlock:(adressBlock)adressBlock;@end

DDMeZonePickerView.m

////  DDMeZonePickerView.m//  BiaoJiePay////  Created by 夏远全 on 16/11/19.//  Copyright © 2016年 广州东德科技. All rights reserved.//#import "DDMeZonePickerView.h"@interface DDMeZonePickerView ()
/** picker选择器*/@property (strong, nonatomic)UIPickerView *customPicker;/** * 原始省份数组 */@property (strong, nonatomic)NSArray *provinceArray;/** * 原始城市数组 */@property (strong, nonatomic)NSArray *cityArray;/** * 原始区镇数组 */@property (strong, nonatomic)NSArray *townArray;/** * 选择省份字典 */@property (strong, nonatomic)NSDictionary *selectedProvinceDic;/** * 选择城市字典 */@property (strong, nonatomic)NSDictionary *selectedCityDic;/** * 确认 */@property (strong,nonatomic)UIButton *sureButton;/** * 取消 */@property (strong,nonatomic)UIButton *cancelButton;@end@implementation DDMeZonePickerView/** * 懒加载 */-(UIPickerView *)customPicker{ if (!_customPicker) { _customPicker = [[UIPickerView alloc]init]; _customPicker.dataSource = self; _customPicker.delegate = self; _customPicker.backgroundColor = XYQColor(153, 153, 153); } return _customPicker;}-(NSArray *)provinceArray{ if (!_provinceArray) { _provinceArray = [NSArray array]; } return _provinceArray;}-(NSArray *)cityArray{ if (!_cityArray) { _cityArray = [NSArray array]; } return _cityArray;}-(NSArray *)townArray{ if (!_townArray) { _townArray = [NSArray array]; } return _townArray;}-(NSDictionary *)selectedProvinceDic{ if (!_selectedProvinceDic) { _selectedProvinceDic = [NSDictionary dictionary]; } return _selectedProvinceDic;}-(NSDictionary *)selectedCityDic{ if (!_selectedCityDic) { _selectedCityDic = [NSDictionary dictionary]; } return _selectedCityDic;}/** * 初始化 */-(instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { [self getPickerData]; self.customPicker.frame = CGRectMake(0, 0, SCREEN_WIDTH, frame.size.height); [self addSubview:self.customPicker]; } return self;}/** * 从本地文件获取数据 */- (void)getPickerData{ NSString *path = [[NSBundle mainBundle] pathForResource:@"provincecity" ofType:@"plist"]; self.provinceArray = [NSArray arrayWithContentsOfFile:path]; //所有的省份 self.selectedProvinceDic = self.provinceArray[0]; self.cityArray = [self.selectedProvinceDic objectForKey:@"city"];//所有的城市 self.selectedCityDic = self.cityArray[0]; self.townArray = [self.selectedCityDic objectForKey:@"area"];//所有的区/县}#pragma mark UIPickerViewDataSource//设置有多少列-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 3;}//设置每列多少行-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ if (component == 0) { return self.provinceArray.count; } else if (component == 1) { return self.cityArray.count; } else { return self.townArray.count; }}#pragma mark - UIPickerViewDelegate//自定义字体大小- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ UILabel *myView = nil; if (component == 0) { myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 100, 30)] ; myView.text = [[self.provinceArray objectAtIndex:row] objectForKey:@"name"]; }else if(component == 1){ myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, (SCREEN_WIDTH-100)/2, 30)]; myView.text = [[self.cityArray objectAtIndex:row] objectForKey:@"name"]; }else{ myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, (SCREEN_WIDTH-100)/2-30, 30)]; myView.text = [[self.townArray objectAtIndex:row] objectForKey:@"name"]; } myView.textAlignment = NSTextAlignmentCenter; myView.font = [UIFont systemFontOfSize:17]; //用label来设置字体大小 myView.backgroundColor = [UIColor whiteColor]; return myView;}//设置宽度- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{ return SCREEN_WIDTH/3;}//返回行高- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{ return 39;}//通过代理方法didSelectRows获取数据- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (component == 0) { //获取省份选中行 self.selectedProvinceDic = self.provinceArray[row]; self.cityArray = [self.selectedProvinceDic objectForKey:@"city"];//所有的城市 self.selectedCityDic = self.cityArray[0]; self.townArray = [self.selectedCityDic objectForKey:@"area"];//所有的区/县 [pickerView reloadComponent:1]; [pickerView reloadComponent:2]; } if (component == 1) { //获取城市选中行 NSInteger cityselectedRow = [pickerView selectedRowInComponent:1]; self.selectedCityDic = self.cityArray[cityselectedRow]; self.townArray = [self.selectedCityDic objectForKey:@"area"];//所有的区/县 [pickerView reloadComponent:2]; } //获取选中的省 NSString *provice = [NSString stringWithFormat:@"%@",[[self.provinceArray objectAtIndex:[pickerView selectedRowInComponent:0]] objectForKey:@"name"]]; //获取选中的市 NSString *city = [NSString stringWithFormat:@"%@",[[self.cityArray objectAtIndex:[pickerView selectedRowInComponent:1]] objectForKey:@"name"]]; //获取选中的县 NSString *town = [NSString stringWithFormat:@"%@",[[self.townArray objectAtIndex:[pickerView selectedRowInComponent:2]] objectForKey:@"name"]]; //赋值 NSString *adressText = [NSString stringWithFormat:@"%@%@%@",provice,city,town]; self.adressBlock(adressText);}/** * 地址传值 */-(void)chooseAdressBlock:(void (^)(NSString *))adressBlock{ if (adressBlock) { self.adressBlock = [adressBlock copy]; }}@end

在ViewController.h懒加载选择器调用block取值:

/** *  选择器 */-(DDMeZonePickerView *)zonePickerView{    if (!_zonePickerView) {        _zonePickerView = [[DDMeZonePickerView alloc]initWithFrame:CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, 240)];        [_zonePickerView chooseAdressBlock:^(NSString *adress) {            self.updateField.text = adress;        }];    }    return _zonePickerView;}

本人原创,欢迎大家分享,转载需注明出处

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/6080937.html
,如需转载请自行联系原作者
你可能感兴趣的文章
Terraform使用案例
查看>>
Mac下brew方式安装mysql
查看>>
开源的任务队列服务HTQ
查看>>
通过微信小程序看前端
查看>>
[LeetCode] Rotate Function
查看>>
iOS - 更轻量级的 AppDelegate - 面向服务设计
查看>>
什么样的爬虫才是好爬虫:Robots协议探究
查看>>
tomcat 部署多个项目的技巧
查看>>
yii2使用多个数据库的案例
查看>>
[LintCode/LeetCode] Search Insert Position
查看>>
Node处理http跨域请求
查看>>
Gradle for Android 第五篇( 多模块构建 )
查看>>
框架 也可以这样用 easy
查看>>
LCUI 1.1.0 Beta 发布,C 的图形界面库
查看>>
Base64
查看>>
MariaDB(mysql)之半同步复制及复制过滤器的使用
查看>>
WCF Ria Service 理解制图版本【待续】
查看>>
【IOS】高仿糗事百科客户端(基本实现了除注册,评论之外的功能)
查看>>
puppet之模块详解
查看>>
shell脚本
查看>>