iOS-省市区选择的实现

一、简介

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

二、需要的东西

  制作这个首先需要一个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==1)

    {

           return 2;

    }else if (component==2)

    {

        return 3;

    }else

    {

        return 4;

    }

    

}

/**

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

 */

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return 3;

}

/**

 *触发的事件

 */

-(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, 100, 30)];

    myView.textAlignment = NSTextAlignmentCenter;

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

    if (component==0) {

        myView.text = @"1";

    }else if (component==1)

    {

        myView.text = @"2";

    }else

    {

        myView.text = @"3";

    }

    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:0] objectForKey:@"cities"];

      areaArr = [[cityArr objectAtIndex:0] 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==0) {   //当是省的时候

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

        [pickerView selectRow:0 inComponent:1 animated:NO];

        [self.areaPicker reloadComponent:1];

        if ([cityArr count]!=0) {    

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

            [pickerView selectRow:0 inComponent:2 animated:NO];

            [self.areaPicker reloadComponent:2];

        }

       }

    else if (component==1)

    {

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

        [pickerView selectRow:0 inComponent:2 animated:NO];

        [self.areaPicker reloadComponent:2];

    }

}

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

 if (component==0) {

        return [provinceArr count];

    }else if(component==1)

    {

        return [cityArr count];

    }else

    {

        return [areaArr count];

    }

5、附加:


获取三列的内容

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

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

    if ([areaArr count]!=0) {

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

    }

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:0] objectForKey:@"cities"];

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

 

}

 

#pragma mark - UIPickerViewDelegate

/**

 *返回每一列的数据个数

 */

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

{

    if (component==0) {

        return [provinceArr count];

    }else if(component==1)

    {

        return [cityArr count];

    }else

    {

        return [areaArr count];

    }

}

/**

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

 */

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

    return 3;

}

/**

 *触发的事件

 */

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

{

    if (component==0) {

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

        [pickerView selectRow:0 inComponent:1 animated:NO];

        [self.areaPicker reloadComponent:1];

        if ([cityArr count]!=0) {

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

            [pickerView selectRow:0 inComponent:2 animated:NO];

            [self.areaPicker reloadComponent:2];

            

        }

    }

    else if (component==1)

    {

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

        [pickerView selectRow:0 inComponent:2 animated:NO];

        [self.areaPicker reloadComponent:2];

    }

 

}

 

/**

 *通过自定义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, 100, 30)];

    myView.textAlignment = NSTextAlignmentCenter;

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

    if (component==0) {

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

    }else if (component==1)

    {

        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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值