iOS开发——高级UI之OC篇&UIdatePicker&UIPickerView简单使用
UIdatePicker&UIPickerView简单使用
/***********************************************************************************/
一:UIdatePicker:(日期控件)
1.UIDatePicker什么时候用? 当用户选择日期的时候,一般弹出一个UIDatePicker给用户选择。
2.UIDatePickerios6和ios7/8的区别
下面看看使用封装的代码怎么去实现它:
因为这个比较简单,所以这里只是简单给出了封装之后UIDatePicker的实现代码
由于我们平时一般都是使用它用来输入一些日期到我们想要的地方,特别是文本框,所以如果我们要封装也是在文本框里面封装,因为文本框邮一个属性inputView,我只要在里面将我们的UIDatePicker设置为这个属性就可以。
-(void)awakeFromNib { [self initWithBirthView]; } -(instancetype)initWithFrame:(CGRect)frame { if (self == [super initWithFrame:frame]) { [self initWithBirthView]; } return self; } -(void)initWithBirthView { UIDatePicker *date = [[UIDatePicker alloc] initWithFrame:CGRectMake(, , , )]; date.locale = [NSLocale localeWithLocaleIdentifier:@"zh"]; date.datePickerMode = UIDatePickerModeDate; [date addTarget:self action:@selector(changeData:) forControlEvents:UIControlEventValueChanged]; self.inputView = date; } -(void)changeData:(UIDatePicker *)datePicker { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSString *data = [fmt stringFromDate:datePicker.date]; self.text = data; }
当我们滚动下面的转盘是文本框也会动态的现实对应的时间:
/********************************************************************************************/
二:UIPickerView:(轮转控件)
这里先说一下UIPickerView相对UIDatePicker要难一点,他的使用类似tableView,但是如果你只是要简单的实现那就没你想的那么难的,不过这个在实际开发中一般很少用到,就算真的用到了我们一一般也是使用已经封装好的直接拿来用。
1.UIPickView什么时候用?
• 通常在注册模块,当用户需要选择一些东西的时候,比如说城市,往往
弹出一个PickerView给他们选择。
2.UIPickView常见用法,演示实例程序 1>独立的,没有任何关系 =>菜单系统。 2>相关联的,下一列和第一列有联系=>省会城市选择 3>图文并帽,=>国旗选择。
3.UIPickView
搭建界面
1> 注意点:PickerView的高度不能改,默认162,PickerView里面每行的高度 可以改,不要弄混淆了。
2.pickerView显示数据
- 1> 如何使用PickerView展示数据? 进入PickerView头文件,有数据源和代理,联想到UITableView,模仿 UITableView的用法。
- 2> 让控制器作为PickerView的数据源,控制器遵守PickerView的数据源方法
2.1>两种方式:1.拖线 2.代码 2.2>系统自带的控件,数据源和代理属性不需要IBOutlet,也能拖 线。自己的属性,想要拖线,必须写IBOutlet。
3> PickerView的数据源方法
- 1> numberOfComponentsInPickerView: 返回多少列
- 2> pickerView:numberOfRowsInComponent: 返回第component列有多少 行
- 3> 和UITableView的区别,每一行长什么样,是由PickerView的代理决 定的。
- 4> 注意:如果没有返回每一行长什么样子,每行就会显示?,看见?,就 知道没有实现每一行长什么样子的方法。
4> PickerView的代理方法
1> 返回第component列第row行长什么样。
- 第component列第row行的展示标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
- 第component列第row行带属性的标题
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger) component
- 第component列第row行展示的视图
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
2> 返回第component列每一行的高度和宽度
- - (CGFloat)pickerView:(UIPickerView *)pickerView
- - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
2> 返回第component列每一行的高度和宽度
- - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
- - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
3> 选中第component列第row行调用
- - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
3. 加载plist数据
- 1> 分析数据结构
- 1> 大数组元素个数:多少列 2>大数组里面的小数组: 这一列有多少行。 3> 小数组里的字符串: 每行展示的样子
4.处理菜单选中业务
- 1> 选中某一列某一行,显示出来
- 2> 拖动不同列,改变不同的label,拖动第一列改变水果。
- 3> 判断拖动哪一列,改变对应的label
- 4> 在viewDidLoad中初始化label显示
- 5> 取出数组中的数据给label直接赋值 _fruitLabel.text = self.foots[0][0]; 这种 方式不好,如果以后数组里有很多数据,要写很多行。
- 6> 还有另外一种方式,通过调用代理,给label赋值.唯一不同的,就是列 数,搞个for循序就好了。
5.随机选中某一列的某一行
1> 如何选中某一行 [self.pickerView selectRow:row inComponent:component
animated:YES];
2> 先随机选中第0列的某一行,随机数取值范围看第0列总共有多少行,
arc4random_uniform(x)随机0~x-1的数
3> 避免随机出来的行数都一样,需要判断下,随机出来的行数和当前选中 的是否一样,一样就重新随机,用while判断,直到随机到不一样,才行。 3> 问题:label没有显示最新选中的一行。
原因:手动调用pickview滚动,选中某一行,不会触发代理,我们自己 主动调用代理,让lebel显示选中哪一行.
注意:只有用户手动滚动才可以触发pickview的代理方法。 4> 每一列都要随机选中,弄个for循序,遍历每一列都随机选中
下面就以代码的方式封装实现一下他:
关于UIPickView,我们知道他使用最多的地方就是在关于区域的选择,比如我们平时在使用一个App或者想要做某些是的时候,上面都需要我们滚动他来告诉他们对应的地址。
所以今天我吗就一地址的实现来封装一个UIPickView,关于其他一些只要会了这个基本上就没有任何问题了,因为这里涉及到了多列动态的现实数据。
首先我们来看看我们需要的plist数据,这里只有部分天朝区域
既然是程序员我们必定要想到MVC,所以根据plist文件创建模型,创建对应的属性,并且模型方法,将字典转成模型:
#import <Foundation/Foundation.h> @interface AddressModel : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSArray *cities; +(instancetype)addWithDict:(NSDictionary *)dict; @end
由于plsit比较简单,所以这里直接使用KVC,关于plist和字典转模型,请查看:。。。。。。,这里非常详细的介绍
#import "AddressModel.h" @implementation AddressModel +(instancetype)addWithDict:(NSDictionary *)dict { AddressModel *model = [[self alloc] init]; [model setValuesForKeysWithDictionary:dict]; return model; } @end
然后同上,由于我们需要实现的事讲选中的内容输入到对应的文本框上面显示,所以先自定义一个继承自UItextFiled得类:
#import <UIKit/UIKit.h> @interface AddressView : UITextField @end
然后在里面创建我们需要的:注意这里最关键的是最后一行代码,没有这里一切都是扯蛋
-(void)initWithAddressView { UIPickerView *pick = [[UIPickerView alloc] initWithFrame:CGRectMake(, , , )]; self.pick = pick; pick.delegate = self; pick.dataSource = self; self.inputView = pick; }
因为我们是要直接使用这个类,但是由于项目的需要,我们可能是使用StoryBoard创建也可能是使用纯代码创建所以,我们需要在两个方法中调用这个初始化的方法:
//纯代码创建
-(instancetype)initWithFrame:(CGRect)frame { if (self == [super initWithFrame:frame]) { [self initWithAddressView]; } return self; } //从文件(Xib/StoryBoard创建) -(void)awakeFromNib { [self initWithAddressView]; }
关于懒加载就不多说了,说太多我也累,直接上代码:
@property (nonatomic, strong) NSArray *cityArr; -(NSArray *)cityArr { if (_cityArr == nil) { NSArray *arr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil]]; NSMutableArray *cityArr = [NSMutableArray array]; for (NSDictionary *dict in arr) { AddressModel *model = [AddressModel addWithDict:dict]; [cityArr addObject:model]; } _cityArr = cityArr; } return _cityArr; }
后面就是关键了,同时也是使用这个控件的一个难点:
遵守协议:
<UIPickerViewDataSource, UIPickerViewDelegate>
由于我们每选中第一列之后都要根据第一列中根据对应的选中项去处里面对应的子项(也就是城市),所以这里需要定义一个变量来记录一下我们选中的第一列:
@property (nonatomic, assign) NSInteger selectCom;
实现必须实现的代理方法:
/******************************************************************************
* *
* UIPickerView代理方法 *
* *
* iCocos--Description *
* *
******************************************************************************/
//列数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { ; }
//对应列的行数
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { //如果是第0列 ) { //直接返回懒加载数组元素的个数 return self.cityArr.count; } else { //否则就是第一列了(因为这里只有两列) //根据选中的第一列从数组中取出来,放到一个模型里面 AddressModel *model = self.cityArr[_selectCom]; //再根据这个模型里面的子项cities里面的元素个数返回对应的行数 return model.cities.count; } }
每列显示的标题文字
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { //如果是第0列 ) { //直接返回懒加载数组元素中对应为name的值 return [self.cityArr[row] name]; } else { //根据选中的第一列从数组中取出来,放到一个模型里面 AddressModel *model = self.cityArr[_selectCom]; //再根据这个模型里面的子项cities,取出里面的每一行返回来显示在第二列中 return model.cities[row]; } }
根据选中显示对应的数据;
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { //如果是第0列 ) { //记录选中第0列的项 self.selectCom = [pickerView selectedRowInComponent:]; //刷新数据(类似tableView的reLoadData) [pickerView reloadComponent:]; //默认选中项 [pickerView selectRow: inComponent: animated:YES]; } else { //根据选中的第一列从数组中取出来,放到一个模型里面 AddressModel *model = self.cityArr[_selectCom]; //将选中的第一列使用一个变量再次纪录一下 NSInteger sel = [pickerView selectedRowInComponent:]; //根据选中的第一列从cities里面取出对应子元素的所有元素,保存到一个字符串 NSString *name = model.cities[sel]; //根据UIPickerView上面对应列,对应行的数据动态的刷新并且显示到文本框中 self.text = [NSString stringWithFormat:@"%@ %@", model.name, name]; } }
如下图:
当我们滚动最后选中左边一行之后右边会根据左边的现实做相应的改变,当我们在滚动最后选中右边列的任意项的时候,文本框根据两个现实的项取得对应的文字显示在界面上:
那么以后如果我需要使用这个或者是类似的,只需要把我们封装好的导入到项目中,然后将我们对应的textField的类设置为我们这里的类酒可以实现了,只需哟做少量的修改!
iOS开发——高级UI之OC篇&UIdatePicker&UIPickerView简单使用的更多相关文章
- iOS开发——高级技术精选OC篇&Runtime之字典转模型实战
Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://w ...
- iOS开发——高级UI—OC篇&退出键盘
退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中 ...
- iOS开发--JS调用原生OC篇
JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...
- iOS开发——高级UI&带你玩转UITableView
带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实 ...
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
- ios开发——常用经典算法OC篇&冒泡/快速
冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
随机推荐
- C++ 容器一些细节
今天学习是看到了讲解C++容器的一些细节用法,故记之!参考:http://www.cnblogs.com/answeryi/archive/2011/12/16/2289811.html: 目录 == ...
- Delphi 延迟函数 比sleep 要好的多
转自:http://www.cnblogs.com/Bung/archive/2011/05/17/2048867.html //延迟函数:方法一 procedure delay(msecs:inte ...
- HIve体系结构,hive的安装和mysql的安装,以及hive的一些简单使用
Hive体系结构: 是建立在hadoop之上的数据仓库基础架构. 和数据库相似,只不过数据库侧重于一些事务性的一些操作,比如修改,删除,查询,在数据库这块发生的比较多.数据仓库主要侧重于查询.对于相同 ...
- searchDisplayController 时引起的数组越界
当 [searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNo ...
- virtualenv 和 virtualenvwrapper 实践
virtualenv 首先来聊一下 virtualenv 是个什么鬼. 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充 ...
- perf
- 纯JS Web在线可拖拽的流程设计器
F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...
- Netbeans Platform 工程,免安装JDK
使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...
- USB设备不能用。提示Windows 无法启动这个硬件设备。 (代码 19)
USB,由于其配置信息(注册表中的)不完整或已损坏, Windows 无法启动这个硬件设备. (代码 19) 原因:提示Windows 无法启动这个硬件设备. (代码 19) 处理解决方法: 1) r ...
- emWin(ucGui) MULTIEDIT控件的按键响应处理 worldsing
目前没有读过ucgui的源代码,通过应用代码测试出在FRAMEWIN的控件焦点顺序是样的: 按资源列表里创建的控件,默认将焦点落在第一个可接收焦点的控件,目前知道不可接收 焦点的控件有TEXT,在FR ...