UIPickerView 地区解析 -- 全国省、市、区 plist 解析 -- 读取UIPickerView 当前显示内容
一个简单的plist 解析过程,借助UIPickerView 实现了手选全国的 省市区 方法,
源码中有详细注释;长句自己可以拆开看,最好的方法是,拆开,并打印,查看每一步打印的结果,结合Plist文件,解读文件读取过程
基本原理是通过字典 、数组、逐层剥壳

源码:
.h
//
// ViewController.h
// AreaAnalysis
//
// Created by Ibokan on 15/8/28.
// Copyright (c) 2015年 Crazy凡. All rights reserved.
// #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>//遵守协议 @end
.m
//
// ViewController.m
// AreaAnalysis
//
// Created by Ibokan on 15/8/28.
// Copyright (c) 2015年 Crazy凡. All rights reserved.
// #import "ViewController.h" @interface ViewController ()
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (nonatomic,strong) NSArray *province;
@property (nonatomic,strong) NSMutableArray *tempdata;//装载当前省的全部数据
@property (nonatomic, strong) NSMutableArray *pickerProvincesData;//当所有省的名称数据
@property (nonatomic, strong) NSMutableArray *pickerCitiesData;//当前的省下面的市名称数据
@property (nonatomic, strong) NSMutableArray *pickerDistrictData;//当前的市下面的区的名称数据
@property int ia,ib;
@end
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.province = [[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area2.plist" ofType:nil]];
self.pickerProvincesData = [[NSMutableArray alloc]init];
self.pickerCitiesData = [[NSMutableArray alloc]init];
self.pickerDistrictData = [[NSMutableArray alloc]init];
self.tempdata = [[NSMutableArray alloc]init];
for(int i = ; i < self.province.count ; [self.pickerProvincesData addObjectsFromArray:[self.province[i++] allKeys]]);//取出所有的keys(省)仅有名称,数据部分是根据省动态获取的
self.ia = self.ib = ;
[self getPickerCitiesData];//获取初始化市
[self getPickerDistrictData];//获取初始化区
self.pickerView.dataSource = self;
self.pickerView.delegate = self;
[self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:]]]];//让label 显示选中的内容(初始化后显示)
}
- (void)getPickerCitiesData//装载市
{
[self.pickerCitiesData removeAllObjects];//清除数据
[self.tempdata removeAllObjects];//清除数据
[self.tempdata addObjectsFromArray:[[NSArray alloc]initWithArray:[self.province[self.ia] valueForKey:self.pickerProvincesData[self.ia]]]];//将当前省的所有数据保存在一个数组中,避免反复读取
for(NSDictionary *dir in self.tempdata) { [self.pickerCitiesData addObjectsFromArray:[dir allKeys]]; }//将市的名称取出
}
- (void)getPickerDistrictData//装载区
{
[self.pickerDistrictData removeAllObjects];
[self.pickerDistrictData addObjectsFromArray:[self.tempdata [self.ib]valueForKey:self.pickerCitiesData[self.ib]]];//填充区的名称
}
#pragma mark 实现协议UIPickerViewDataSource方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {return ; }//设定有几列
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
switch (component) {//设定每一列有多少行
case : return self.pickerProvincesData.count; break;
case : return self.pickerCitiesData.count; break;
case : return self.pickerDistrictData.count; break;
default: break;
}
return ;
}
#pragma mark 实现协议UIPickerViewDelegate方法
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {//设定行内容
switch (component) {
case : return [self.pickerProvincesData objectAtIndex:row]; break;
case : return [self.pickerCitiesData objectAtIndex:row]; break;
case : return [self.pickerDistrictData objectAtIndex:row]; break;
default: break;
}
return ;
}//设定行内容结束
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
switch (component) {//检测滑动事件(row 是行 component 是代表滚动的列)
case :
self.ia = (int) row;
self.ib = ;
[self getPickerCitiesData];//重新装载城市数据
[self getPickerDistrictData];//重新装载区数据
[self.pickerView reloadComponent:];//重新填充城市列表
[self.pickerView reloadComponent:];//重新填充城市列表
break;
case :
self.ib = (int) row;
[self getPickerDistrictData];
[self.pickerView reloadComponent:];
break;
default: break;
}
[self.infoLabel setText:[NSString stringWithFormat:@"%@;%@;%@",self.pickerProvincesData[[self.pickerView selectedRowInComponent:]],self.pickerCitiesData[[self.pickerView selectedRowInComponent:]],self.pickerDistrictData[[self.pickerView selectedRowInComponent:]]]];//刷新 label 显示的内容 (每次滚动后刷新)
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@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 前一句 应该都懂了,后面一句是取出当前选中的是第几行
UIPickerView 地区解析 -- 全国省、市、区 plist 解析 -- 读取UIPickerView 当前显示内容的更多相关文章
- html实现 省——市——区三级联动
html实现 省——市——区三级联动 html中实现三级联动是一个不错的demo,博主在这里跟大家分享一下实现的过程,以及自己在过程中出现的一些问题,仅供参考. 首先我们将全国的省市区数据导入进来, ...
- 病毒木马查杀实战第023篇:MBR病毒之引导区的解析
前言 引导型病毒指寄生在磁盘引导区或主引导区的计算机病毒.这种病毒利用系统引导时,不对主引导区的内容正确与否进行判别的缺点,在引导系统的过程中入侵系统,驻留内存,监视系统运行,伺机传染和破坏.按照引导 ...
- DEX文件解析--3、dex文件字符串解析
一.前言 前两篇文章链接: 1.DEX文件头解析 2.DEX文件校验和解析 PS:前几天检查文件夹的时候发现DEX文件解析还只写了开头,正好找点事情来做,就去接着解析DEX ...
- plist的读取和写入
// 从plist中读取数组数据 let arrPath = Bundle.main.path(forResource: "ArrayPList", ofType: "p ...
- Json--Android中数据文件解析(Json解析--从服务器端获取数据并且解析,显示在客户端上面)
前面学习过了使用SAX解析XML数据(点击进入:SAX解析XML数据),今天学习Json解析: 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Json数据 ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时
js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时 >>>>>>>>>&g ...
- Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据
版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...
- mybatis源码-解析配置文件(二)之解析的流程
目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...
随机推荐
- Java 理论与实践: 非阻塞算法简介--转载
在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保 ...
- Scope Chain(作用域链)
本章,我们讨论一下ECMAScript中的作用域链 , 开门见山. 什么是作用域链 i.ECMAScript是允许创建内部函数的,甚至能从父函数中返回这些函数.作用域链正是内部上下文中所有变量对象(及 ...
- 第三篇:GPU 并行编程的运算架构
前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别? 本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流 ...
- 知识点摸清 - - function()——JavaScript 函数名后什么时候加括号,什么时候不
加括号——调用函数 只要是要调用函数执行的,都必须加括号. 此时,function()实际上等于函数的返回值.(没有返回值也已经执行了函数体内的行为).就是说,只要加括号的,就代表将会执行函数体代码. ...
- 用Java发送邮件
要用Java发送邮件,除过JDK本身的jar包之外,还需要两个额外的jar包:JavaMail和JAF.当然,如果你使用的JavaEE的JDK,那就不用单独去网上下载了,因为JavaEE的JDK中已经 ...
- Uri、UriMatcher、ContentUris详解
http://blog.csdn.net/feng88724/article/details/6331396 1.Uri 通用资源标志符(Universal Resource Identifier, ...
- Tomcat- java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
在MyEclipse中启动Tomcat的时候报错: java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServ ...
- SQL Server死锁日志各字段含义
使用跟踪标记 1204 --打开跟踪标记 DBCC TRACEON (1204,-1) --关闭跟踪标记 DBCC TRACEOFF (1204,-1) 处于死锁状态时,跟踪标记 1204 在等待的线 ...
- 十六、C# 常用集合类及构建自定义集合(使用迭代器)
常用集合类及构建自定义集合 1.更多集合接口:IList<T>.IDictionary<TKey,TValue>.IComparable<T>.ICollectio ...
- 深度探索va_start、va_arg、va_end
采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...