iOS开发-------选择器(UIPickView)

选择器是什么呢,对于用iphone的用户来讲肯定不陌生,那么对于我们这些用Android的用户来讲可能会比较少见,因为我们一直崇尚是通过点击的,而很少滑动,先用图来看一下什么是选择器(UIPickView)呢

     


默认的形式大家可能觉得很难看,没错,楼主也是这么觉得,但是我们学习的时候只要弄明白他是怎么运行的,那么在以后,画面可以随时改,但是用法是不变的,至于怎么好看,估计也不是我们写程序人员的工作了吧。


这个应用的作用是,我通过先滑动左边的首字符,然后根据首字符,右侧的城市也会发生相应的改变,然后通过点击按钮,那么你选中的首字母和城市名字就会出现在lable中。


这个练习用到了一个之前没有提到过的文件,后缀名叫做plist,什么叫做plist呢,说白了就是一个文件,这个文件如果用笔记本打开,其实就是xml,大家如果听到xml会晕的话,这个不需要担心,因为我们有苹果公司这个强大的后台,给大家看一下什么叫plist




                      


总体是一个字典,我们可以知道字典中是可以存储对象的,并不是只有NSString 才是对象, NSArray也是对象,所以当然可以存取数组

字典的存取都是一个键值对的形式,所以每个数组对象我们都为它赋值一个key,方便获取


如果我想自己创建,怎么创建plist文件呢,步骤如下

首先选择New File->iOS->Resoure->Property list  相信大家看图也已经发现了


再就是使用pickView需要设置delegate (代理)和 datasource (数据源)

代理如果不是很明白,就是说,我想要用这个pickView,那么我必须要遵循他给我的协议,协议在以后的objc的复习博客中会单独提起

数据源呢,就是说我显示pickView,不可能就显示这么一个组件,而没有任何的文字和数据,当然那是没有任何意义的,谁为它提供数据,谁就是它的数据源

   其他的话不说了,上代码吧


头文件:

//
//  ViewController.h
//  UIPickView (选择器)博客
//
//  Created by YueWen on 15/8/19.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

实现文件

//
//  ViewController.m
//  UIPickView (选择器)博客
//
//  Created by YueWen on 15/8/19.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

#import "ViewController.h"
#define ROW 2

@interface ViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>

@property(nonatomic,strong)UIPickerView * mainPickView;//主pickView(选择器)

@property(nonatomic,strong)NSDictionary * allInfo;//储存所有的plist的数据

@property(nonatomic,strong)NSArray * cityArray;//存放城市的名字的数组

/*
 为什么要在这里定义一个专门存放首字母的数组呢
 通过 字典的 一个方法 allkeys 不就获得了所有的首字母了吗
 字典的allkeys的方法 返回的是一个存放 键Key的数组 但这个数组是无序的,顺序会和你想的顺序有差别
 */
@property(nonatomic,strong)NSArray * wordArray;//存放首字母的数组


@property(nonatomic,strong)UILabel * label;//显示数据的标签

@property(nonatomic,strong)UIButton * button;//获取按钮
-(void)clickButton;//按钮的监听


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //初始化mainPickView
    self.mainPickView = [[UIPickerView alloc] initWithFrame:CGRectMake(40, 120, 300, 250)];
    self.mainPickView.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [self.view addSubview:self.mainPickView];
    
    
    //初始化label
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(40, 380, 300, 50)];
    [self.label setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
    self.label.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:self.label];
    
    //初始化按钮
    self.button = [UIButton buttonWithType:UIButtonTypeSystem];
    self.button.frame = CGRectMake(140, 460, 60, 30);
    [self.button setTitle:@"获取" forState:UIControlStateNormal];
    self.button.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [self.button addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.button];
    
    
    //获取cityplist中的值
    /*
     [NSBundle mainBundle] 是 获取该app存在的根目录,通过方法 pathForResource获得 字符串形式的路径
     pathForResource后面跟的是文件的名字   type后跟的是后缀名
     */
    NSString * cityPath = [[NSBundle mainBundle] pathForResource:@"citydict" ofType:@"plist"];
    
    //通过路径获取字典
    self.allInfo = [NSDictionary dictionaryWithContentsOfFile:cityPath];
    
    //获取plis首字母cityOrder中的值
    NSString * cityOrderPath = [[NSBundle mainBundle] pathForResource:@"cityOrder" ofType:@"plist"];
    
    //获取所有的首字母
    self.wordArray = [NSArray arrayWithContentsOfFile:cityOrderPath];
    
    
    //获取默认的城市,默认是第1个
    self.cityArray = self.allInfo[self.wordArray[0]];
    
    //将自己设置为pickView的数据源
    self.mainPickView.dataSource = self;
    //将自己设置为pickView的代理
    self.mainPickView.delegate = self;
    
}


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



#pragma 实现UIPickerViewDelegate的协议的方法

//返回的是 选择器的 列数 因为我们上图可以看到,是两列,所以返回的是2
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return ROW;
}

//返回的是每一列的个数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    //如果是第一列,就是显示首字母的那一列,返回的是存放首字母数组的个数
    if (component == 0)
    {
        return self.wordArray.count;
    }
    else//如果是第二列,就是显示城市的那一列,返回的是存放城市的数组的个数
    {
        return self.cityArray.count;
    }
}





#pragma 实现UIPickerViewDataSource的协议的方法

//返回的是component列的行显示的内容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0)//如果是首字母的那一列
    {
        //row表示你已经选中第几行了,当然是从0开始的
        return self.wordArray[row];
    }
    else//如果选择的是城市那一列
    {
        //返回的是城市那一列的第row的那一行的显示的内容
        return self.cityArray[row];
    }
}

//如果选中某行,该执行的方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //如果首字母那一列被选中
    if (component == 0)
    {
        //获取选中的首字母,并自定义selectWord来接收
        NSString * selectWord = self.wordArray[row];
        //获取字典中以 首字母 为key 的数组
        NSArray * array = self.allInfo[selectWord];
        //将城市的数组,赋值给存放城市的属性
        self.cityArray = array;
        //重新加载第1列(真实的第一列是0列)
        [self.mainPickView reloadComponent:1];
    }
}



/**
 *  实现按钮的点击
 */
-(void)clickButton
{
    //获取首字母那一列(第0列)选中的行数
    NSInteger row1 = [self.mainPickView selectedRowInComponent:0];
    //获取城市那一列(第1列)选中的行数
    NSInteger row2 = [self.mainPickView selectedRowInComponent:1];
    //存放首字母的数组 通过下标(行数)获取 首字母
    NSString * word = self.wordArray[row1];
    //存放城市的数组 通过下标(行数)获取 城市名字
    NSString * city = self.cityArray[row2];
    
    NSString * title = [NSString stringWithFormat:@"%@ %@",word,city];
    //设置label的文字
    [self.label setText:title];
}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值