iOS学习 - UIPickerView

作者: Shawn_ | 来源:发表于2016-01-16 23:57 被阅读6660次

      把学习iOS过程中的一些知识整理出来,方便大家互相交流.同时希
    望可以给予我一些帮助和指导.谢谢大家啦!
    其实.在我们手机应用上面,也会经常见到UIPickerView,但是是以加载了数据的方式展现在我们的面前.
    今天.做个UIPickerView的Demo,这个小项目主要是体现UIPickerView的基本用法.


    1. 新建工程后,在Main.storyboard中拖入UIPickerView和UILabel两个控件.


      拖入控件显示效果

    2.之后要对控件进行数据设置,我们要通过拖线的方式,将控件和控制器进行连接,这样可以通过属性来访问控件对象.


    对控件进行拖线 拖线成功显示状态,显示往哪个区域拖线

    3.为了监听控件发生的行为,我们需要对控件设置代理,而UIPickerView不仅要设置代理,也要设置数据源.是因为之后要通过数据来确定UIPickerView有多少行,多少列.

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.pickerView.delegate = self;
        self.pickerView.dataSource = self;
    
    }
    

    4.说到设置代理,不仅仅只是设置完就可以了.它还要经过其他的两个步骤之后才可对控件进行真正的监听.那么其他两个步骤是什么呢?不着急,待我细细道来.

    设置代理的三步骤:
    1.设置代理者.
    2.代理者必须遵守代理协议.
    3.实现代理方法.
    
    代理,其实就是众多方法声明的集合,那么这么多的方法,都需要我们去实现吗?当然不啦!
    那样.我们岂不是要拥有记忆魔法面包才可以.那么开健身房,确实是个好主意.好了不打岔,我们继续.
    那么在这么多的方法中如何来区分什么方法需要去实现,而什么方法可实现也可不实现呢?
    其实,是根据标示符来进行判断.那么是哪几个标示符呢?
    @required
    `这个范围内的方法必须实现,如果不实现,编译器会报错`
    @end
    @optional(声明的方法可实现可不实现)
    `这个范围内的方法可实现也可不实现,编译器不会报错`
    @end
    

    5.那么刚才我们已经实现了第一步,而且是让控制器作为代理,那么我们就一起完成接下来的两步吧.

    • 让控制器遵守代理协议,数据源协议
    让控制器遵守代理协议,数据源协议
    • 实现协议方法
      • 数据源协议中有必须要实现的两个方法,协议中没有需要实现的方法,大家有的时候,不太清楚这些,其实可以选中方法名,然后按住command,点到这个方法里面去看看,我也是初学者,我平时要么勤学好问,要么就进去看一看,虽然都是英文满天飞,但是我认为,只要你肯努力,就可以学好.
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    {
     `为了说明,在UIPickerView中有多少列`
    }
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
     `为了说明每列有多少行`
    }
    `为什么一定要实现这两个方法呢?我个人理解,如果不实现这两个方法的话,
    不能精准定位数据在哪个位置,那么UIPickerView根本就没法放置数据啊`
    

    OK,刚才实现了数据源协议里面必须实现的方法,按习惯,我们也会想,那
    
    代理协议里面有没有必须要实现的方法,那我们点进协议看下,发现没有
    
    必须要实现的方法,那不写啦.停!!!等等啊,我
    
    之前是使用了两个控件,一个是UIPickerView,另一个是
    
    UILabel,那么UIPickerView的功能大家大概了解啦,那么UILabel是为了做什么?
    
    当然是现实数据啦!如果不把数据显示出来,咱们看着UIPickerView上面
    
    的数据,然后滑来滑去,滑来滑去,滑来滑去....
    
    那么,怎么让UILable显示出UIPickerView滑动之后确定的数据呢?
    
    那我们就要用到代理协议里面的方法啦
    
    • 代理方法
    -(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
    `每行每列显示的内容
    (NSString*) -- 返回一个字符串;
    系统一运行,就会调用这个方法;
    `
    }
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
    `选中UIPickerView中的哪行哪列
    通过这个方法,可以将选中的数据赋值给UILabel上,让其显示出来
    (void) -- 无返回值
    
    当你只要一滑动UIPickerView,就会调用这个方法;
    `
    }
    
    

    6.讲到这里啦,那么我们就要来加载数据啦,因为之前我说过了,数据源协议里面的方法需要用到数据来实现,所以接下来我们要导入数据啦.

    • 我用懒加载的方法加载数据,这样可以避免重复导入,提高效率,如果这个数组中没有值,就进行赋值;如果里面有值,就直接返回这个数组.
    • 加载.plist文件,来进行数据的导入.
    
    -(NSArray *)foodNameArray
    {
        if (_foodNameArray == nil) {
           NSString *path =[[NSBundle mainBundle]pathForResource:@"foods" ofType:@"plist"];
            
           _foodNameArray=[NSArray arrayWithContentsOfFile:path];
           
        }
        return _foodNameArray;
    }
    

    7.将数据导入之后,我们就马上要完成整个项目了.期待最后的结果的展现吧.只需要在那些方法里面添加一些东东就可以啦.这些东东,代表你想通过这个方法实现的事情.

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    {
        return self.foodNameArray.count;
        
    }
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
        NSArray *countArray =self.foodNameArray[component];
        return  countArray.count;
        
    }
    
    -(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        NSArray *countArray =self.foodNameArray[component];
        NSString *rowString =countArray[row];
        return  rowString;
    }
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        self.nameLabel.text =self.foodNameArray[component][row];
        
    }
    
    

    8.当程序一加载,可以让UIPickerView选中第0列第0行.这样比较规范,当然啊,我们也可以设定别的值.

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.pickerView.delegate = self;
        self.pickerView.dataSource = self;
    
       [pickView ]
    
    
    • 选中第0列第0行


      选中第0列第0行展示效果图
    • 设定别的值


      初始值未设定0列0行

      9.展示最后的效果喽.


      最后Demo的效果

    相关文章

      网友评论

      • 超_iOS:请问楼主,滑动太快导致程序崩溃有什么建议吗
      • ChefZhang:我只想问,这是什么截图软件,告诉我啊
        Shawn_:@贱喵_ 是说我技术水平很低?
        Shawn_:@ChefZhang 哈哈,求我啊

      本文标题:iOS学习 - UIPickerView

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