iOS:城市级联列表的使用

简介:

1、介绍:

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

 

2、效果图如下:

 

3、用法:

(1)导入本地城市级联文件:provincecity.plist.zip

(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 <UIKit/UIKit.h>

/**
 *  声明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 ()<UIPickerViewDataSource,UIPickerViewDelegate>

/** 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 ,如需转载请自行联系原作者
相关文章
|
JSON 小程序 Android开发
小程序列表左滑效果在IOS呈上下滑动影响样式
小程序列表左滑效果在IOS呈上下滑动影响样式
331 0
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
2112 11
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
356 2
|
iOS开发
iOS UIKit Dynamics Demo 学习地址列表
iOS UIKit Dynamics Demo 学习地址列表
292 0
|
iOS开发
iOS开发-聊天气泡的绘制和聊天消息列表
iOS开发-聊天气泡的绘制和聊天消息列表
641 0
iOS开发-聊天气泡的绘制和聊天消息列表
|
iOS开发
iOS开发:城市选择器集成
该项目集成了三种类型的城市选择器: 1、XXCityPickerView 省市区,可以分级:1省 2省-市 3省-市-区 2、SQSelectAddress 省市区乡/镇,页面跳转 3、RattanCityPicker 省市区,包含邮编地址,开放多个属性设置的接口
713 0
iOS开发:城市选择器集成
|
程序员 iOS开发
iOS 列表 UITableView 提速指南
从08年到现在开发过的iOS应用不计其数了,但是面试很多人的时候,发现依然很多同学在最基本的列表控件上懂得不够深,下面就结合各方面的资料进行再一次讲解。 我们都知道纯代码是效率最高的,但是在开发成本上已经越来越不如使用Storyboard性价比高,速度快,所以本文试图结合UIStoryboard来描述一整套方案。
446 0
iOS 列表 UITableView 提速指南
|
安全 iOS开发 开发者
ios应用列表调整后排名规则
ios应用列表调整后排名规则
|
缓存 算法 iOS开发
iOS性能优化系列篇之“列表流畅度优化”
原文作者:Hello_Vincent原文地址:https://juejin.im/post/5b72aaf46fb9a009764bbb6a#heading-1 这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化。
1944 0
|
iOS开发 开发者
直播APP开发之iOS开发中的列表优化思路
APP开发中,列表可能是平时我们打交道最多的UI控件之一,其重要性不言而喻,对其性能的优化同样至关重要。而对于iOS开发,列表就是我们常说的UITableView / UICollectionView。在进行直播APP开发时针对于列表的优化自然是必不可少的。
1931 0