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

本文共 6960 字,大约阅读时间需要 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;}

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

转载于:https://www.cnblogs.com/XYQ-208910/p/6080937.html

你可能感兴趣的文章
7月23号=》261页-265页
查看>>
软考知识点梳理--综合布线
查看>>
Mysql5.6主从热备配置
查看>>
VS2010DebugView捕捉
查看>>
mfix中更改time dependent VTK filename的最大时间步数的容量
查看>>
Windows7安装 docker-compose的过程
查看>>
关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西
查看>>
php递归创建文件夹的两种方法
查看>>
6.新增事件
查看>>
|洛谷|二分|P1182 数列分段Section II
查看>>
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
查看>>
Oracle学习第七课-表连接及其应用
查看>>
Python基础篇【第十三篇】:面向对象
查看>>
bzoj 2465 小球
查看>>
String类
查看>>
NoSQL简介
查看>>
java_2018_Day5_变量的格式
查看>>
在C++中调用DLL中的函数
查看>>
leetcode 32. Longest Valid Parentheses
查看>>
OpenSSL创建私有CA
查看>>