UIPickView和UIDatePicker

一、介绍UIPickView和UIDatePicker

1.UIPickView什么时候用?

•通常在注册模块,当用户需要选择一些东西的时候,比如说城市,往往

弹出一个PickerView给他们选择。•老虎机效果

2.UIPickView常见用法,演示实例程序1>独立的,没有任何关系=>菜单系统。2>相关联的,下一列和第一列有联系=>省会城市选择3>图文并帽,=>国旗选择。

3.UIPickView


UIPickView和UIDatePicker_第1张图片

4.UIDatePicker什么时候用?当用户选择日期的时候,一般弹出一个UIDatePicker给用户选择。

5.UIDatePickerios6和ios7的区别


UIPickView和UIDatePicker_第2张图片

二、点餐系统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解决角标越界的问题,当当前弹出键盘的文本框是第一个角标的时候,上一个不允许点击


五、项目中的常见文件


UIPickView和UIDatePicker_第3张图片
UIPickView和UIDatePicker_第4张图片
UIPickView和UIDatePicker_第5张图片

六、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>内存警告:清空不必要的内容

你可能感兴趣的:(UIPickView和UIDatePicker)