iOS学习 - UIPickerView

  把学习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的效果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容