UIPickerView 地区解析 -- 全国省、市、区 plist 解析 -- 读取UIPickerView 当前显示内容

一个简单的plist 解析过程,借助UIPickerView 实现了手选全国的 省市区 方法,

源码中有详细注释;长句自己可以拆开看,最好的方法是,拆开,并打印,查看每一步打印的结果,结合Plist文件,解读文件读取过程

基本原理是通过字典 、数组、逐层剥壳

源码:

.h

 1 //
 2 //  ViewController.h
 3 //  AreaAnalysis
 4 //
 5 //  Created by Ibokan on 15/8/28.
 6 //  Copyright (c) 2015年 Crazy凡. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 @interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>//遵守协议
12
13
14 @end

.m

 1 //
 2 //  ViewController.m
 3 //  AreaAnalysis
 4 //
 5 //  Created by Ibokan on 15/8/28.
 6 //  Copyright (c) 2015年 Crazy凡. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10
11 @interface ViewController ()
12 @property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
13 @property (weak, nonatomic) IBOutlet UILabel *infoLabel;
14 @property (nonatomic,strong) NSArray *province;
15 @property (nonatomic,strong) NSMutableArray *tempdata;//装载当前省的全部数据
16 @property (nonatomic, strong) NSMutableArray  *pickerProvincesData;//当所有省的名称数据
17 @property (nonatomic, strong) NSMutableArray  *pickerCitiesData;//当前的省下面的市名称数据
18 @property (nonatomic, strong) NSMutableArray  *pickerDistrictData;//当前的市下面的区的名称数据
19 @property int ia,ib;
20 @end
21 @implementation ViewController
22
23 - (void)viewDidLoad {
24     [super viewDidLoad];
25     // Do any additional setup after loading the view.
26     self.province = [[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area2.plist" ofType:nil]];
27     self.pickerProvincesData = [[NSMutableArray alloc]init];
28     self.pickerCitiesData = [[NSMutableArray alloc]init];
29     self.pickerDistrictData = [[NSMutableArray alloc]init];
30     self.tempdata = [[NSMutableArray alloc]init];
31     for(int i = 0 ; i < self.province.count ; [self.pickerProvincesData addObjectsFromArray:[self.province[i++] allKeys]]);//取出所有的keys(省)仅有名称,数据部分是根据省动态获取的
32     self.ia = self.ib = 0;
33     [self getPickerCitiesData];//获取初始化市
34     [self getPickerDistrictData];//获取初始化区
35     self.pickerView.dataSource = self;
36     self.pickerView.delegate = self;
37     [self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:0]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:1]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:2]]]];//让label 显示选中的内容(初始化后显示)
38 }
39 - (void)getPickerCitiesData//装载市
40 {
41     [self.pickerCitiesData removeAllObjects];//清除数据
42     [self.tempdata removeAllObjects];//清除数据
43     [self.tempdata addObjectsFromArray:[[NSArray alloc]initWithArray:[self.province[self.ia] valueForKey:self.pickerProvincesData[self.ia]]]];//将当前省的所有数据保存在一个数组中,避免反复读取
44     for(NSDictionary *dir in self.tempdata) { [self.pickerCitiesData addObjectsFromArray:[dir allKeys]]; }//将市的名称取出
45 }
46 - (void)getPickerDistrictData//装载区
47 {
48     [self.pickerDistrictData removeAllObjects];
49     [self.pickerDistrictData addObjectsFromArray:[self.tempdata [self.ib]valueForKey:self.pickerCitiesData[self.ib]]];//填充区的名称
50 }
51 #pragma mark 实现协议UIPickerViewDataSource方法
52 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {return 3; }//设定有几列
53 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
54     switch (component) {//设定每一列有多少行
55         case 0: return self.pickerProvincesData.count; break;
56         case 1: return self.pickerCitiesData.count; break;
57         case 2: return self.pickerDistrictData.count; break;
58         default: break;
59     }
60     return 0;
61 }
62 #pragma mark 实现协议UIPickerViewDelegate方法
63 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {//设定行内容
64     switch (component) {
65         case 0: return [self.pickerProvincesData objectAtIndex:row]; break;
66         case 1: return [self.pickerCitiesData objectAtIndex:row]; break;
67         case 2: return [self.pickerDistrictData objectAtIndex:row]; break;
68         default: break;
69     }
70     return 0;
71 }//设定行内容结束
72 - (void)pickerView:(UIPickerView *)pickerView  didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
73     switch (component) {//检测滑动事件(row 是行  component 是代表滚动的列)
74         case 0:
75             self.ia = (int) row;
76             self.ib = 0;
77             [self getPickerCitiesData];//重新装载城市数据
78             [self getPickerDistrictData];//重新装载区数据
79             [self.pickerView reloadComponent:1];//重新填充城市列表
80             [self.pickerView reloadComponent:2];//重新填充城市列表
81             break;
82         case 1:
83             self.ib = (int) row;
84             [self getPickerDistrictData];
85             [self.pickerView reloadComponent:2];
86             break;
87         default: break;
88     }
89     [self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:0]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:1]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:2]]]];//刷新 label 显示的内容 (每次滚动后刷新)
90 }
91 - (void)didReceiveMemoryWarning {
92     [super didReceiveMemoryWarning];
93     // Dispose of any resources that can be recreated.
94 }
95 @end

知识点:

先说一下 UIPickerView吧,我只是让你会用,理解的话,自己看文档 command + 鼠标左键   别告诉我不认识英文,我也不认识!

废话不多说:

首先是遵守协议:

<UIPickerViewDelegate, UIPickerViewDataSource>//遵守协议

其次 是实现方法;也就是下面很长这一块;代码中有注释,我再摘出来单独说一下

#pragma mark 实现协议UIPickerViewDataSource方法

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {return 3; }//设定有几列(return  N  就有N列)

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

switch (component) {//设定每一列有多少行  看参数  component 代表当前在为第几列设定行数,return  N  就会为第几列设定多少行

case 0: return self.pickerProvincesData.count; break;

case 1: return self.pickerCitiesData.count; break;

case 2: return self.pickerDistrictData.count; break;

default: break;

}

return 0;

}

#pragma mark 实现协议UIPickerViewDelegate方法

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {//设定行内容

switch (component) {//设定行的内容,Component 是列  row 是列中的行,  也就是  给 第几行几列设定值(返回值就是 设定的值)

case 0: return [self.pickerProvincesData objectAtIndex:row]; break;

case 1: return [self.pickerCitiesData objectAtIndex:row]; break;

case 2: return [self.pickerDistrictData objectAtIndex:row]; break;

default: break;

}

return 0;//这里是写代码的失误吧,换成nil 更好 为了保证和上面贴的源码一致,就不改了,下面下载的文件中改过来,大家见谅,

}

- (void)pickerView:(UIPickerView *)pickerView  didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

switch (component) {//检测滑动事件(row 是行  component 是代表滚动的列)  判断滑动的是第几列 然后  刷新数据

case 0:

self.ia = (int) row;

self.ib = 0;

[self getPickerCitiesData];//重新装载城市数据

[self getPickerDistrictData];//重新装载区数据

[self.pickerView reloadComponent:1];//重新填充城市列表

[self.pickerView reloadComponent:2];//重新填充城市列表

break;

case 1:

self.ib = (int) row;

[self getPickerDistrictData];

[self.pickerView reloadComponent:2];

break;

default: break;

}

[self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:0]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:1]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:2]]]];//刷新 label 显示的内容 (每次滚动后刷新)这句下面有解析,我就不重复了

}

1、

self.province = [[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area2.plist" ofType:nil]];

不多解释,Plist文件读取,很多次了,

2、

self.pickerProvincesData = [[NSMutableArray alloc]init];

可变数组初始化,记得使用之前一定要初始化,一定要初始化,一定要初始化,重要的事情说三遍!!很小的问题,但是(自己)会经常忘掉,然后找半天错……都是空、都是泪、

3、

for(int i = 0 ; i < self.province.count ; [self.pickerProvincesData addObjectsFromArray:[self.province[i++] allKeys]]);

字典数组怎么取出所有字典的key值,addObjectsFromArray 和 allKeys 的完美搭配

4、

[self.pickerCitiesData removeAllObjects];//清除数据

重新使用可变数组记得清空!!!

5、

[self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:0]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:1]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:2]]]];

好吧,这句话好长,但是很简单

可以拆为stringWithFormat 和  self.pickerView selectedRowInComponent:0  前一句  应该都懂了,后面一句是取出当前选中的是第几行

下载源码?点我啊

时间: 2024-10-18 21:12:20

UIPickerView 地区解析 -- 全国省、市、区 plist 解析 -- 读取UIPickerView 当前显示内容的相关文章

html实现 省——市——区三级联动

html实现  省--市--区三级联动 html中实现三级联动是一个不错的demo,博主在这里跟大家分享一下实现的过程,以及自己在过程中出现的一些问题,仅供参考. 首先我们将全国的省市区数据导入进来,这里已经直接整理搜集好了.如下: var provinceList = [ {name:'北京', cityList:[ {name:'市辖区', areaList:['东城区','西城区','崇文区','宣武区','朝阳区','丰台区','石景山区','海淀区','门头沟区','房山区','通州区

WinForm Timer控件,三级联动[省,市,区]

Timer控件: 组件中的最后一个控件,功能是可以根据用户自定义的时间间隔来触发时间,不会印象窗体本身的其他事件进行. 属性: Enable  设置控件是否启用 Interval  设置事件的频率,以毫秒为单位 事件只有一个:Tick事件 例:使用timer控件获取当前时间并即时变动 private void timer1_Tick(object sender, EventArgs e) { label1.Text = DateTime.Now.ToString("yyyy年MM月dd日hh时m

全国-省-市-编码

11 北京市12 天津市13 河北省14 山西省15 内蒙古自治区21 辽宁省22 吉林省23 黑龙江省31 上海市32 江苏省33 浙江省34 安徽省35 福建省36 江西省37 山东省41 河南省42 湖北省43 湖南省44 广东省45 广西壮族自治区46 海南省50 重庆市51 四川省52 贵州省53 云南省54 西藏自治区61 陕西省62 甘肃省63 青海省64 宁夏回族自治区65 新疆维吾尔自治区71 台湾省81 香港特别行政区82 澳门特别行政区1301 石家庄市1302 唐山市13

数据-全国地级市城市名,编码

1301,石家庄市,131302,唐山市,131303,秦皇岛市,131304,邯郸市,131305,邢台市,131306,保定市,131307,张家口市,131308,承德市,131309,沧州市,131311,衡水市,131401,太原市,141402,大同市,141403,阳泉市,141404,长治市,141405,晋城市,141406,朔州市,141407,晋中市,141408,运城市,141409,忻州市,141411,吕梁市,141501,呼和浩特市,151502,包头市,15150

PList解析

PList解析 PList 主要在苹果开发中常用,很多后台并不会返回 PList 的数据格式,有关 Plist 的反序列化知道即可 /** 参数 1. data:   要反序列化的二进制数据 2. option: 选项,位移枚举类型 NSPropertyListImmutable = 0,                   不可变 NSPropertyListMutableContainers = 1,           容器可变 NSPropertyListMutableContainer

2018年全国卷Ⅰ卷理科数学解析

2018年全国卷Ⅰ卷理科数学解析 原文地址:https://www.cnblogs.com/wanghai0666/p/9192454.html

2018年全国卷Ⅰ卷文科数学解析

2018年全国卷Ⅰ卷文科数学解析 原文地址:https://www.cnblogs.com/wanghai0666/p/9192463.html

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

Android中 GsonFormat插件解析Jason 数据+和风天气接口解析案例

首先 转载自http://www.cnblogs.com/androidsuperman/p/4579249.html     感谢 @西北野狼  同学. 第一部分: GsonFormat 插件基本使用方法 很久以前写json解析用原始的解析json的方法,后来为了加快开发进度,开始使用gson,fastjson等第三方jar包来进行json解析,为了保持apk足够小,不因为引入jar包导致apk文件过大,选择使用gson来加速json解析,当然,去年androidstudio 1.0版本出来,