省市选择器

效果图:

不多说奉上代码:

//
//  areaPickerView.m
//  省市选择器
//
//  Created by iBokanwisdom on 15/8/31.
//  Copyright (c) 2015年 pangLee. All rights reserved.
//

#import "areaPickerView.h"

@interface areaPickerView ()
//创建一个UIPickerView
@property (nonatomic,strong) UIPickerView *areaPickerView;
//显示当前选定的省市区
@property (nonatomic,strong) UILabel * areaShowLabel;

//存储第一次解析的省市字典
@property (nonatomic,strong) NSDictionary * areaData;
//存储第二次解析的省市字典
@property (nonatomic,strong) NSDictionary * provinceData;

//储存省市数组
@property (nonatomic,strong) NSMutableArray * province;
//存放省下级市
@property (nonatomic,strong) NSMutableArray * city;
//存放市下级区县
@property (nonatomic,strong) NSMutableArray * district;
@end

@implementation areaPickerView

- (void)viewDidLoad {
    [super viewDidLoad];

    //初始化显示Label
    self.areaShowLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 270, 320, 50)];
    self.areaShowLabel.backgroundColor = [UIColor groupTableViewBackgroundColor];
    self.areaShowLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview: self.areaShowLabel];

    //初始化UIPickerViw
    self.areaPickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 55, 320, 160)];
    [self.view addSubview:self.areaPickerView];

    //先解析plist文件 将数据存储到数组中
    [self analysisAreaPlist];
    //默认显示第一列第一行第二列第一行 第三列第一行数据
    [self analysisAreaPlistGetCityInformationWithComponentRow:0];
    [self districtInformationWithComponetRow:0];
    //显示Label
    [self displayLable];

    self.areaPickerView.delegate = self;
    self.areaPickerView.dataSource = self;
}

- (void)analysisAreaPlist
{
    //第一次解析plist文件 将数据全部存储到areaData字典中
    self.areaData = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area.plist" ofType:nil]];
    //初始化省市数组
    self.province = [[NSMutableArray alloc]init];
    //根据键值 循环获取 省 信息并存到province数组中
    for(int i = 0;i < self.areaData.count ;i++)
    {
        //从plist文件中可以看出
        //从字典中根据i值获取所有键值,获取每个字典下的第一个数据就是省信息
        [self.province addObject:[[[self.areaData valueForKey:[NSString stringWithFormat:@"%d",i]] allKeys]objectAtIndex:0]];
    }
}

//根据第一列的省市获取 省市的下级市
- (void)analysisAreaPlistGetCityInformationWithComponentRow:(NSInteger)row
{
    //第二次解析第一次的字典 获取省市下级市的信息存到provinceData中
    self.provinceData = [[self.areaData objectForKey:[NSString stringWithFormat:@"%ld",row]] objectForKey:self.province[row]];

    //初始化下级市数组
    self.city = [[NSMutableArray alloc]init];
    //循环获取下级市信息 存到city数组中
    for(int i = 0;i < self.provinceData.count;i++)
    {
        [self.city addObject:[[[self.provinceData valueForKey:[NSString stringWithFormat:@"%d",i]] allKeys]objectAtIndex:0]];
    }
}

//获取下级市的下级区县信息
- (void)districtInformationWithComponetRow:(NSInteger)row
{
    //初始化区县数组  ??为什么在此初始化而不是在外面?
    //因为每次滑动改变省市时,省市的下级市,下级区县都是变化的 都是要重新获取的,否则就会造成可变数组数据的继续累积
    self.district = [[NSMutableArray alloc]init];
    self.district = [[self.provinceData objectForKey:[NSString stringWithFormat:@"%ld",row]] objectForKey:self.city[row]];
}

//显示Label
- (void)displayLable
{
    //获取第一列当前行
    NSString *provinceText =[self.province objectAtIndex:[self.areaPickerView selectedRowInComponent:0]];
    //获取第二列当前行
    NSString *cityText =[self.city objectAtIndex:[self.areaPickerView selectedRowInComponent:1]];
    //获取第三列当前行
    NSString *districtText =[self.district objectAtIndex:[self.areaPickerView selectedRowInComponent:2]];
    //在label中显示
    self.areaShowLabel.text = [NSString stringWithFormat:@"%@-%@-%@",provinceText,cityText,districtText];
}

//获取UIPickerView列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    //省市 省下级市 区  一共三列 所以返回值为三
    return 3;
}

//获取UIPickerView每列的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(component == 0)
    {
        return self.province.count;
    }
    if(component == 1)
    {
        return self.city.count;
    }
    if(component == 2)
    {
         return self.district.count;
    }
    return 0;
}

//设置每列显示什么信息  第一列显示省市 第二列显示下级市 第三列显示下级县区
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if(component == 0)
    {
       return [self.province objectAtIndex:row];
    }
    if(component == 1)
    {
        return [self.city objectAtIndex:row];
    }
    if(component == 2)
    {
        return [self.district objectAtIndex:row];
    }
    return 0;
}

//监听滚轮 滚动的是第一列还是第二列 联动事件
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if(component == 0)
    {
        //如果滚动第一列 要根据第一列的行 去获取第二列的信息再根据第二列的行去获取第三列的信息
        //默认是滚动第一列显示第二列首行 第三列首行
        [self analysisAreaPlistGetCityInformationWithComponentRow:row];
        [self districtInformationWithComponetRow:0];
        //刷新UIPickerView
        [self.areaPickerView reloadComponent:1];
        [self.areaPickerView reloadComponent:2];

    }
    if(component == 1)
    {
        //滚动第二列 第一列不动 第三列随行数变化
        [self districtInformationWithComponetRow:row];
        [self.areaPickerView reloadComponent:2];
    }
    //显示在Label上
    [self displayLable];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-12-12 09:27:14

省市选择器的相关文章

自定义省市选择器 微信小程序多列选择器

由于微信小程序的选择器为省市区选择器共3列 如我仅需要省市2列的选择器 就需要我们另寻他法找来找去没有合适的 只能自己写了 1. 首先我们把所需要的省数据 市县数据放在一个 p_c.js 文件里面,使用的时候可以通过util 来引用 //p_c.js module.exports = { "province": [ { "title": "上海市", "weight": 1, "evaluation_value&qu

微信小程序picker组件 - 省市二级联动

微信小程序picker组件自带省市区选择器,但是业务需求需要省市选择器,参考官方demo自己写了一个省市选择器 wxml文件 <view class="section"> <view class="section__title">省市二级联动demo</view> <picker mode="multiSelector" bindchange="bindMultiPickerChange&quo

微信公众号 几种移动端UI框架介绍

微信公众号开发,主要是移动端网页的页面开发,在这里推荐3个移动端UI框架:WeUI.SUI和Mint UI. 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计,可以令用户在HTML5应用中的使用感知更加统一. 组件包含button.cell.dialog. progress, toast.article.icon等等. 资源 官方Demo:https://weui.io/ Github:https://Github.com/weui/weui (★1340

winform form

WinForm:Windows Form,.Net中用来开发Windows窗口程序的技术,无论是之前学的控制台程序,还是后面要学的asp.net都是调用.net框架,因此所有知识点都是一样的.新建一个windows项目:Windows-->Windows窗体应用程序控件:窗口上很多元素都是相似的,因此将这些元素抽象为一些类,这些类就叫做控件.识别PowerPoint中的控件,按钮(Button),文本框(TextBox).标签(Label).单选按钮(RadioButton).复选框(Check

jquery ajax实现省市二级联动

今天给大家带来使用jQuery ajax实现的省市联动效果.我们直奔主题,先说下实现思路: 准备数据 这里数据库我使用的是mysql,先看下表格: provience表 city表 这里使用provience表的主键作为city表的外键,等下根据省份的id查找对应的市区 查询方法的封装 接下来就是实现查询所有省市以及根据省份id查找对应的城市的方法,这里我写了一个BaseDao封装了一些基本的数据库链接以及关闭连接的方法: BaseDao.java package com.jqueryajax.

由移动端级联选择器所引发的对于数据结构的思考

GitHub:https://github.com/nzbin/Framework7-CityPicker Demo:https://nzbin.github.io/Framework7-CityPicker/ 前言 最近在做移动端项目的时候遇到了省市区选择的功能.以往做项目时都是省市区分开的下拉框样式.这次希望实现效果图要求的级联选择器.我是 Framework7 框架的忠实粉丝,庆幸的是 Framework7 已经有模拟 iOS 选择框效果的 Picker 组件.在开发之前我先搜索了现有的一

jQuery_完成省市二级联动

当填表的时候会让你设计某省某市怎么设计,应该明白,如果你选择了一个确定的省,那么在第二个下拉框内则不会有除了你选择的省的市之外的名称.而这功能用js来实现很麻烦,但是用jq确很容易实现. 原表结构: 代码如下: <!DOCTYPE html> <html> <head> <script typr="text/javascript" src="js/jquery-1.8.3.js"></script> <

CSS3选择器:nth-child和:nth-of-type之间的差异

对于p:nth-child选择器,选择一个元素如果: 这是个段落元素 这是父标签的第二个子元素 对于p:nth-of-type选择器,选择一个元素如果: 选择父标签的第二个段落子元素 :nth-of-type选择器,限制条件少

CSS3选择器 ::selection选择器

"::selection"伪元素是用来匹配突出显示的文本(用鼠标选择文本时的文本).浏览器默认情况下,用鼠标选择网页文本是以"深蓝的背景,白色的字体"显示的,效果如下图所示: 从上图中可以看出,用鼠标选中"专注IT.互联网技术"."纯干货.学以致用"."没错.这是免费的"这三行文本中,默认显示样式为:蓝色背景.白色文本. 有的时候设计要求,不使用上图那种浏览器默认的突出文本效果,需要一个与众不同的效果,此时