美文网首页iOS常用属性
UIPickView和UIDatePicker

UIPickView和UIDatePicker

作者: Hevin_Chen | 来源:发表于2016-09-19 11:26 被阅读220次

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

    相关文章

      网友评论

        本文标题:UIPickView和UIDatePicker

        本文链接:https://www.haomeiwen.com/subject/nttnettx.html