写在开头

  • 昨天学习了iOS一个简单的控件。 UIPickerView;
  • UIPickerView组件类似HTML都Select组件效果,提供数据供用户选择。可以通过plist文件提供数据。UIPickerView是一个选择器控件,可以生成单列的选择器,也可以生成多列的选择器,而且开发者完全可以自定义选择项的外观,用法十分灵活。UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成
  • 类似于上面的闹钟实现,UIPickerView也是有自己的代理方法和数据源。

UIPickerView实现简单的demo

  • 要实现的代理
  • UIPickerViewDataSource的方法
  • 协议中有两个必须实现的方法-分别是设置选择器的行和列数
  • UIPickerViewDelegate
返回UIPickerView中Component列的宽度- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;返回UIPickerView中Component列中每行的高度- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;当选择某一项Component列中的row行时的回调函数- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component- 标准的UIPickerView内容,只有字符串- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;自定义的UIPickerView内容,给每个列,行设置一个UIView对象- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;----这里列为component,行row返回一个UIView用来显示在UIPickerView中。reusingView:(UIView *)
  • 既然有数据源,那参考UITableView就有reloadData方法
- (void)reloadAllComponents;
- (void)reloadComponent:(NSInteger)component;

DEMO实现

  • 我实现了3个列表的联动,第一个列表代表了组别,第二个列表对应第一个列表的内容,滑动第一个列表会出发delegate事件,刷新数据
  • m文件的实现
#import "ViewController.h"@interface ViewController ()
//@property (nonatomic, copy)NSArray *pickerArray;
@property (nonatomic, copy)NSArray *directionArray;
@property (nonatomic, copy)NSArray *currentNameArray;
@property (nonatomic, copy)NSArray *nameArray1;
@property (nonatomic, copy)NSArray *nameArray2;
@property (nonatomic, copy)NSArray *nameArray3;
@property (nonatomic, copy)NSArray *nameArray4;
@property (nonatomic, copy)NSArray *Dict;
@property (nonatomic, copy)NSArray *endArray;
@property (nonatomic, copy)NSString *currentEndString;
@property (nonatomic, strong)UIPickerView *pickerView;
@end@implementation ViewController

  • 初始化pickerView
 self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 220, [UIScreen mainScreen].bounds.size.width, 200)];self.pickerView.delegate = self;self.pickerView.dataSource = self;
  • 初始化数组
self.directionArray = @[@"EDG", @"NBA", @"Bro", @"OS"];self.nameArray1 = @[@"Flander", @"Jiejie", @"Scout", @"Viper", @"Mekio", @"ClearLove"];self.nameArray2 = @[@"KingJames", @"Curry", @"Jordan", @"Durant", @"Harden"];self.nameArray3 = @[@"LdQ", @"ScMokey", @"HJC"];self.nameArray4 = @[@"MacOS", @"iOS", @"WatchOS", @"PadOS"];self.endArray = @[@"LOL", @"Stars", @"Friends", @"Study"];self.Dict = @[_nameArray1, _nameArray2, _nameArray3, _nameArray4];
  • 数据源实现
  • 返回3组 代表了3个列表,对于- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component方法,我的参考是component和tableview的indexpath的section一样,对于第一个列表component == 0返回第一列的长度

  • Delegate实现
  • - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 类似于tableview的返回indexpath的对应内容的方法
// 滑动触发事件
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {// 使用一个UIAlertView来显示用户选中的列表项if (component == 0) {self.currentNameArray = self.Dict[row];self.currentEndString = self.endArray[row];[self.pickerView reloadComponent:1];[self.pickerView reloadComponent:2];//这个方法的selectRow即可以表示你更新第一个列表之后是否更新到第二个列表的对应的row// BOOL类型的YES表示动画效果[self.pickerView selectRow:0 inComponent:1 animated:YES];[self.pickerView selectRow:0 inComponent:2 animated:YES];NSLog(@"选择了%@方向", self.directionArray[row]);} else {NSLog(@"%@", self.currentNameArray[row]);}
}
  • 如何实现滑动第一个列表刷新第二个列表,如上述代码,在滑动component的时候刷新第二个列表和
  • 对于代码里面的[self.pickerView selectRow:0 inComponent:1 animated:YES]; [self.pickerView selectRow:0 inComponent:2 animated:YES];方法,就是在滑动刷新完之后是否让回到row = 0的内容,animated即是是否开启动画效果
  • 返回列表内容的函数
// 返回列表的内容
#pragma mark UIPickerViewDelegate;
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {//    NSLog(@"%@", self.directionArray[row]);if (component == 0) {return self.directionArray[row];} else if (component == 1){return  self.currentNameArray[row];} else {return  self.currentEndString;}
}
// 返回列表的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {return 130;
}

总结

  • 很简单但是很实用的控件,在项目里也许会用到

【iOS开发】-UIPickerView相关推荐

  1. 【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row

    这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己 ...

  2. 【iOS 开发】Objective-C 运算符

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41624613 参考文章 : 1.[iOS 开发]Object-C 运算符 2.[iO ...

  3. IOS开发高级之点餐系统的实现-01

    IOS开发高级之点餐系统的实现-01 // // ViewController.m // 01-点餐系统 // // Created by 鲁军 on 2021/2/11. //#import &qu ...

  4. iOS:iOS开发系列–打造自己的“美图秀秀”(中)

    来源: KenshinCui 链接:http://www.cnblogs.com/kenshincui/p/3959951.html 其他状态设置 常用的图形上下文状态设置上面基本都用到了,我们不再一 ...

  5. ios开发问题汇总(一)

    教程汇总 IOS比较好的网络教程:IOS编程浅蓝教程 IOS编程教程(五)自定义UITableView的表单元格 菜鸟教程-iOS教程 开发问题 实现页面切换,网上某些文章写的是: [self.nav ...

  6. iOS开发常用三方库、插件、知名博客

    TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...

  7. iOS开发第三方大全

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  8. iOS开发基础知识--碎片37

    iOS开发基础知识--碎片37 iOS开发基础知识--碎片37 iOS开发基础知识--碎片37 1:iOS 使用NJKWebViewProgress做webview进度条 引入头文件: #import ...

  9. iOS 开发的资源整理

    本文整理了常用的iOS.mac开源项目及类库,是开发者必备的一份资料,现在分享给广大的iOS程序员兄弟们,希望给他们的开发工作带来帮助. UI 下拉刷新 EGOTableViewPullRefresh ...

  10. iOS开发-技术知识盘点总结(二)

    1> UINavgationController使用 导航控制器之间切换供用一块导航条! 导航条的内容由栈定控制器决定! 显示在我们眼前的永远是栈顶控制器! 左上角的返回按钮文字是特例由上一个控 ...

最新文章

  1. Ubuntu 修改本地磁盘名称
  2. 关于float的说明
  3. android如何根据机顶盒区分用户,Android 上手机跟机顶盒应用开发的区别
  4. CocoStudio资源区导入Plist/PSD文件
  5. P2294 [HNOI2005]狡猾的商人
  6. 打开是什么样子的图片_情侣头像 | 无论是什么样子的你 我都好喜欢
  7. 退出出库复核是什么意思_电商仓储与传统仓储有什么不同?
  8. HBase从入门到精通系列:误删数据如何抢救?
  9. 电脑端的mafsvr服务关掉_想在电脑上玩手游,你得试试这款 quot;同屏助手quot; 了...
  10. macbook视频格式转换_如何将Mac视频格式转换
  11. C++输出透明背景字体
  12. Go的goroutine
  13. 人脸对齐:Wing Loss人脸关键点检测算法2018
  14. 树莓派启动自动连接WiFi
  15. Sort_1000pics数据集利用CNN实现图像分类
  16. linux 打开三维stl文件,三维stl文件查看工具下载
  17. 单片机、嵌入式错综复杂的关系分析
  18. yuv图解(YUV444,YUV422,YUV420,YV12,NV12,NV21)
  19. 【转载】浅谈 flash 中的设计模式:模版
  20. 前端应用开发架构图谱

热门文章

  1. UE4 如何将TextureRenderTarget2D保存为本地图片
  2. 30亿网民坐稳啦!互联网之门将要换钥匙
  3. 好程序员web前端学习路线分享css3中的渐进增强和降级
  4. java三种循环的流程图画法总结(for,while,do-while循环)
  5. 【单片记笔记】基于STM32F103的NEC红外发送接收使用同一个定时器的一体设计
  6. c 空间点到直线的垂足及距离计算
  7. 张艾迪(创始人):我们接管世界
  8. Java面试题-前端ES6
  9. Python pandas 读取csv/txt数据文件 python读取csv/txt文件
  10. 你还停留在使用Dagger2吗? 带你一步一步走进Dagger2的世界