一、介绍UIPickView和UIDatePicker
1.UIPickView什么时候用?
•通常在注册模块,当用户需要选择一些东西的时候,比如说城市,往往
弹出一个PickerView给他们选择。•老虎机效果
2.UIPickView常见用法,演示实例程序1>独立的,没有任何关系=>菜单系统。2>相关联的,下一列和第一列有联系=>省会城市选择3>图文并帽,=>国旗选择。
3.UIPickView
4.UIDatePicker什么时候用?当用户选择日期的时候,一般弹出一个UIDatePicker给用户选择。
5.UIDatePickerios6和ios7的区别
二、点餐系统PickerView(熟悉)
1.搭建界面
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:componentanimated:YES];
2>先随机选中第0列的某一行,随机数取值范围看第0列总共有多少行,arc4random_uniform(x)随机 0~x-1的数
3>避免随机出来的行数都一样,需要判断下,随机出来的行数和当前选中的是否一样,一样就重新随机, 用while判断,直到随机到不一样,才行。
4>问题:label没有显示最新选中的一行。
原因:手动调用pickview滚动,选中某一行,不会触发代理,我们自己主动调用代理,让lebel显示选中 哪一行.
注意:只有用户手动滚动才可以触发pickview的代理方法。
5>每一列都要随机选中,弄个for循 序,遍历每一列都随机选中
三、选择国旗(熟悉)
1.搭建界面
2.设置pickerView的数据源3.分析有多少列,只有一列,因为是文字和图片是同时滚动,如果两列的话,不会同时滚动
4.加载plist数据,分析数据结构
plist是个数组:返回这一列有多少行国旗
数组里是一个字典:描述着国旗的属性
5.字典转模型
6.有了数据就需要把数据展示到界面,不能用返回每行标题的方法
7.搞一个View,每行需要展示一个标题和图片
8.自定义view,系统自带的UIView,不好使
9.用xib描述自定义view,里面控件是固定的
10.设置每行的高度为4411.返回每行cell样子的代理方法,reusingView在ios7没有效果,view永远都是
空,没有做缓存。
四 键盘处理
1.搭建界面
2.文本框不可以让用户编辑
2.1不能设置enable= NO,键盘不能弹出来
2.2通过代理,不允许用户输入,只有生日和城市不需要用户输入,添加一个判断
3.自定义生日键盘
3.1 UIDatePicker基本使用,模式,地区3.2监听UIDatePicker的事件,继承UIControl,直接addTarget
3.3日期格式对象,把date转换字符串,显示到文本框
4.自定义城市键盘
4.1 UIPickerView,展示数据需要设置数据源和代理
4.2解析plist数据,分析数据结构plist是个数组,表示有多少个省份数组里是一个字典,里面包含省份的信 息,名称和城市列表
4.3实现数据源和代理,把数据展示到视图
4.4和之前的点餐不一样,之前直接能获取到每一列有多少行,这里需要判断当前是哪一列,根据第0列获取 第1列的行数,第0列是省,第1列是城市,城市由省决定
4.5返回第component列多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) { // 描述省会
return self.provinces.count;
}else{ // 描述选中的省会的城市
// 获取省会
XMGProvince *p = self.provinces[_proIndex];
return p.cities.count;
}
}
4.6返回第component列第row行的标题,这里的行号可能是第0列的和第1列的,需要做判断。第0列的 row,表示是哪个省,第1列的row,表示是当前第1列选中的省会的哪个城市。
第0列,省会的标题,取决于省会数组行号
第1列,城市的标题,取决于当前选中哪个省
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) { // 描述省会
// 获取省会
XMGProvince *p = self.provinces[row];
return p.name;
}else{ // 描述选中的省会的城市
// 获取选中的省会的角标
NSInteger index = [pickerView selectedRowInComponent:0];
// 获取选中省会
XMGProvince *p = self.provinces[_proIndex];
// 当前选中的内蒙古省,只有12个城市,角标0~11,但是右边城市是北京,北京的城市大于12个城市,所以滚动的时候会出现越界。
NSLog(@"province:%@, count:%ld row:%ld",p.name,p.cities.count,row);
#warning TODO:
return p.cities[row];
}
}
4.7解决二级联动的问题,两列同时滚动,会报角标越界错误
原因:返回每一行的样子的代理方法会经常调用,只要有新的一行出现就会调用。这里每次都会获取最 新选中的省,而第0列展示的是之前选中的省会,如果最新选中的省会的城市总数小于之前选中的省会。
假设:最新选中的城市只有有4个,但是之前选中的省会城市有10行,当第1列滚到5就会报角标越界错 误。
解决方式:这里不能获取最新的选中省会,需要记录之前选中的,且只需要记录一次,在选中一行的代理 方法里记录。
注意:在刷新城市之前记住省会角标,应该刷新的城市,是当前选中的省会的城市。
4.8监听城市选择,选中新的省会。
1>记录选中的省会
2>刷新第1列
3>第一列默认选中第一个城市
4>把选中的省会和获取选中的城市显示到文本框
5.添加自定义键盘工具条
5.1封装工具条:继承UIView,原因:不让外界知道里面是什么东西,就不能修改Toolbar里面的东西。
5.2固定的,用xib述,并且 供类方法快速创建对象
5.3整个文本框应该拥有同一个键盘工具条,懒加载一个键盘工具条,然后遍历所有的文本框,搞个可变 数组把所有文本框添加到数组
5.4监听item点击,通过代理通知控制器。
5.5当点击下一个,应该是后面的文本框有弹出键盘,成为第一响应者,怎么判断下一个文本框是谁?
○把所有文本框加入到数组中,记录当前弹出键盘的文本框所在的角标,++就是下一个文本框了。
○在文本框开始编辑的时候,记录,编辑的文本框就是弹出键盘的文本框
5.6解决角标越界的问题,当当前弹出键盘的文本框是第一个角标的时候,上一个不允许点击
五、项目中的常见文件
六、UIApplication
1.什么是UIApplication?
注意:UIApplication不能手动创建,不能alloc init,一个应用程序只允许
一个。
为什么要弄成单例,UIApplication对象是用来设置应用全局信息的,一个
应用程序如果有很多UIApplication对象,都不知道听谁的。
验证:单例和不能alloc,init
2.UIApplication的作用:做应用级别的操作
2.1>设置应用图标右上角的数字,图标需要手动清除,应用程序关闭,不
会自动清除.
applicationIconBadgeNumber
2.2>显示联网状态,告诉用户此应用正在联网networkActivityIndicatorVisible
2.3>打开一个资源3.URL:一个资源的唯一路径
3.1>网络资源URL的组成==协议头://主机域名/路径http://www.baidu.com/abc/1.png
3.2>本地资源URL的组成==协议头:///路径 本机域名可以不写file:///User/apple/Desktop/1.png
4.UIApplication打开资源的好处:不用判断用什么软件打开,系统会自动根据协议头判断。
5.UIApplication管理状态栏.PPT演示
5.1> ios7默认交给控制器,需要配置下,不交给控制器管理,就会交个UIApplication管理。
5.2>动画隐藏状态栏
5.3>动画设置状态栏样式
七、UIApplication的Delegate
1.AppDelegate的作用:
•为什么要搞个AppDelegate,代理设计模式,有些事情自己不想处理,交
给别人处理
•怎么成为UIApplication的代理,遵守协议。
2.在哪设置UIApplication的代理,需要了解ios程序的启动过程.
2.1>创建application,创建并且设置application的代理
2.2>开启事件循环,不断监听事件。如果产生系统事件,就会通知代
理,其他事件,会找到一个最合适的视图处理事件。2.3>只有应用程序关闭,才会结束程序
3.UIApplicationMain函数:PPT演示
•注意UIApplicationMain函数会开启一个事件循环,并不会马上就执行完
毕。
•底层做的事情,创建UIApplication对象和UIApplicationDelegate对象,设置
UIApplication的代理,开启事件循环,监听系统事件。
3.1>delegateClassName不能传nil,这里传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载,因为视图都是懒加载的,因此就不会创建窗口,什么东西都没有。
3.2>principalClassName传nil,默认是UIApplication,创建一个
UIApplication对象。
4.UIApplication代理的作用:处理系统事件,不是任何事件都交给他处理,按
钮点击,屏幕点击都不是他处理,是由UIApplication处理。
2.1>加载完成,初始化的操作
2.2>进入后台:一般在这里保存应用的数据(游戏数据,比如暂停游戏)
2.3>内存警告:清空不必要的内容