选择器是什么呢,对于用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