您的位置:首页 > 产品设计 > UI/UE

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

2015-09-09 09:37 661 查看
选择器是什么呢,对于用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: