一、简介

该文主要实现的是省市区的选择,可在个人修改地址的地方使用。

二、需要的东西

  制作这个首先需要一个area.plist文件,该文件中保存这所有的关于省市区的信息,下载地址:http://pan.baidu.com/s/1qWFPf8g

三、制作原理

  通过一个UIPickerView来显示,将UIPickerView分成三部分,省、市、区。进而加载数据。

四、实现效果

  图片展示:

五、具体实现步骤:

1、首先,新建一个Single View APplication,然后在Storyboard中添加一个UIpicker View

2、实现UIPicker View的代理方法  --这里的数据是暂时的,还没添加数据

#pragma mark - UIPickerViewDelegate

/**

 *返回每一列的数据个数

 */

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

{

    if(component==)

    {

           return ;

    }else if (component==)

    {

        return ;

    }else

    {

        return ;

    }

}

/**

 *返回pickerView分几列,因为是省市区选择,所以分3列

 */

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return ;

}

/**

 *触发的事件

 */

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

{

    NSLog(@"ss");

}

/**

 *通过自定义view去显示pickerView中的内容,这样做的好处是可以自定义的调整pickerView中显示内容的格式

 */

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

{

    UILabel *myView = nil;

    myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, , )];

    myView.textAlignment = NSTextAlignmentCenter;

    myView.font = [UIFont systemFontOfSize:];         //用label来设置字体大小

    if (component==) {

        myView.text = @"";

    }else if (component==)

    {

        myView.text = @"";

    }else

    {

        myView.text = @"";

    }

    return myView;

}

3、接下来就是把刚才下载的那个area.plist文件中的数据加入到picker View中

  ①、首先定义三个NSArray。

   

 NSArray *provinceArr,*cityArr,*areaArr;

  ②、先设置provinceArr.cityArr,areaArr.

  provinceArr = [[NSMutableArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area.plist" ofType:nil]];

      cityArr = [[provinceArr objectAtIndex:] objectForKey:@"cities"];

      areaArr = [[cityArr objectAtIndex:] objectForKey:@"areas"];

   默认的province列先显示的第一列,此时刚好让city显示第一列的city,让area显示第一个city的area。

  注:(此处这样设置是因为这个area.plist文件的结构的原因,你可以自己看一下这个plist文件)。

4、此时数据便有了,但是当滚动第一列时,第二列和第三列都没有变化,其实本质上就是在设置pickerView内容的代理方法中设置内容改变。重头戏来了。--修改上面的这个代理方法。  

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

{

    if (component==) {   //当是省的时候

        cityArr = [[provinceArr objectAtIndex:row] objectForKey:@"cities"];

        [pickerView selectRow: inComponent: animated:NO];

        [self.areaPicker reloadComponent:];

        if ([cityArr count]!=) {    

             areaArr = [[cityArr objectAtIndex:] objectForKey:@"areas"];

            [pickerView selectRow: inComponent: animated:NO];

            [self.areaPicker reloadComponent:];

        }

       }

    else if (component==)

    {

        areaArr = [[cityArr objectAtIndex:row] objectForKey:@"areas"];

        [pickerView selectRow: inComponent: animated:NO];

        [self.areaPicker reloadComponent:];

    }

}

 注:不要忘了重新设置每一列的数据个数

 if (component==) {

        return [provinceArr count];

    }else if(component==)

    {

        return [cityArr count];

    }else

    {

        return [areaArr count];

    }

5、附加:

  

获取三列的内容

  province= [[provinceArr objectAtIndex:[self.areaPicker selectedRowInComponent:]] objectForKey:@"state"];  //获取province

     city=  [[cityArr objectAtIndex:[self.areaPicker selectedRowInComponent:]] objectForKey:@"city"];

    if ([areaArr count]!=) {

         area =  [areaArr objectAtIndex:[self.areaPicker selectedRowInComponent:]];

    }

6、完成,附上源码。(故事版上的设置大家自己设置就行了)

  

//

//  ViewController.m

//  ProvinceCityDownTownChoose

//

//  Created by xiaoguizi on 15/2/9.

//  Copyright (c) 2015年 xiaoguizi. All rights reserved.

//

 ------.m文件------

#import "ViewController.h"

@interface ViewController ()

{

    NSArray *provinceArr,*cityArr,*areaArr;

}

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    provinceArr = [[NSMutableArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"area.plist" ofType:nil]];

    cityArr = [[provinceArr objectAtIndex:] objectForKey:@"cities"];

    areaArr = [[cityArr objectAtIndex:] objectForKey:@"areas"];

}

#pragma mark - UIPickerViewDelegate

/**

 *返回每一列的数据个数

 */

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

{

    if (component==) {

        return [provinceArr count];

    }else if(component==)

    {

        return [cityArr count];

    }else

    {

        return [areaArr count];

    }

}

/**

 *返回pickerView分几列,因为是省市区选择,所以分3列

 */

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return ;

}

/**

 *触发的事件

 */

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

{

    if (component==) {

        cityArr = [[provinceArr objectAtIndex:row] objectForKey:@"cities"];

        [pickerView selectRow: inComponent: animated:NO];

        [self.areaPicker reloadComponent:];

        if ([cityArr count]!=) {

            areaArr = [[cityArr objectAtIndex:] objectForKey:@"areas"];

            [pickerView selectRow: inComponent: animated:NO];

            [self.areaPicker reloadComponent:];

        }

    }

    else if (component==)

    {

        areaArr = [[cityArr objectAtIndex:row] objectForKey:@"areas"];

        [pickerView selectRow: inComponent: animated:NO];

        [self.areaPicker reloadComponent:];

    }

}

/**

 *通过自定义view去显示pickerView中的内容,这样做的好处是可以自定义的调整pickerView中显示内容的格式

 */

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

{

    UILabel *myView = nil;

    myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, , )];

    myView.textAlignment = NSTextAlignmentCenter;

    myView.font = [UIFont systemFontOfSize:];         //用label来设置字体大小

    if (component==) {

        myView.text =[[provinceArr objectAtIndex:row] objectForKey:@"state"];

    }else if (component==)

    {

        myView.text =[[cityArr objectAtIndex:row] objectForKey:@"city"];

    }else

    {

        myView.text =[areaArr objectAtIndex:row];

    }

    return myView;

}

@end

------.h文件------

//

//  ViewController.h

//  ProvinceCityDownTownChoose

//

//  Created by xiaoguizi on 15/2/9.

//  Copyright (c) 2015年 xiaoguizi. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate>

@property (weak, nonatomic) IBOutlet UIPickerView *areaPicker;

@end

iOS-省市区选择的实现的更多相关文章

  1. IOS 如何选择delegate、notification、KVO?

    IOS 如何选择delegate.notification.KVO? 博客分类: IOS   前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有 ...

  2. iOS解析XML实现省市区选择

    1.具体内容就不再赘述了.直接看关键代码. viewController.h // // ViewController.h // ParseXmlToRealizeChooseCityDemo // ...

  3. iOS 正确选择图片加载方式

    正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种: //方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png ...

  4. IOS 如何选择delegate、notification、KVO?(转)

    前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细 ...

  5. js三级省市区选择

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. IOS 日期选择

    传统方式 一般情况下弹出日期选择的场景是:用户点击UITextField弹出日期选择,关键代码如下: 点击UITextField弹出日期选择 1 2 3 UITextField *textField; ...

  7. OS X升级到10.11后Xcode6.4界面无iOS device选择栏的解决办法

    原来在Xcode6.4项目运行按钮右侧会有一个可以选择设备或模拟器的选择栏,但是升级后没有了.但是Xcode7.0.1打开同样的项目会有显示. 简单找了一下无果后,发现咋Xcode顶部菜单里可以找到切 ...

  8. iOS 载入图片选择imageNamed 方法还是 imageWithContentsOfFile?

    Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其參数为图片的名字. 2. imageWithContentsOfFile,其參数也是图片文件的路径. 那 ...

  9. iOS 可选择的购物车

    最近看了淘宝的购物车,于是做了一个可选择的购物车模板. 如果有好的建议请提出,带我日后更新.

  10. ios uiimagepickercontroller 选择相册或者拍照上传

    首先需要实现UIImagePickerControllerDelegate 代理 实现其imagePickerController 方法  这里用于选择图片或的拍照回调 //调用相机拍照 或者 图库选 ...

随机推荐

  1. 通过反射实现IOC功能

    这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...

  2. Java进阶之JDBC

    一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  3. 趁webpack5还没出,先升级成webpack4吧

    上一次将webpack1升级到3,也仅是 半年前,前端工具发展变化太快了,如今webpack4已经灰常稳定,传说性能提升非常高,值得升级. 一直用着的webpack3越来越慢,一分多钟的编译时间简直不 ...

  4. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  5. Linux终端命令全面介绍

    Linux终端命令 一.文件目录类 1.建立目录:mkdir 目录名2.删除空目录:rmdir 目录名3.无条件删除子目录: rm -rf 目录名4.改变当前目录:cd 目录名 (进入用户home目录 ...

  6. c# 数组协变

    class a{} class b:a{} a[] arr=new a[3]; a[] arr2=new a[3]; 给arr 数组赋值 arr[0]=new a(); arr2[0]=new b() ...

  7. Java基础——Oracle(一)

    Oracle是目前最流行的数据库之一.功能强大,性能卓越.所以学起来比较困难.学习Oracle需要具备一定的基础.比如学习过一门编程语言,或者学过其他的数据库等,没有一些基础很难下手. 一.Oracl ...

  8. 【Java并发编程】20、DelayQueue实现订单的定时取消

    当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种: 第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的压 ...

  9. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  10. 【实践练习一】Git以及Github的使用

           以前经常在同学大神那听说过Github这神器,虽敬佩久已,奈何却无缘使用.好吧,我承认,主要还是不会用,一看网站全是英文的,想想还是不要为难自己了.然而现在还是要为难自己了,趁着早上刚学 ...