PickerView用于展示供选择的内容(例如日期选取、点菜等)。

有三种情况:

1.每一列都是独立的选取

2.右边的列受到左边列的影响

3.包含图片

PickerView和TableView类似,通过数据源来显示数据,与TableView同样地,让控制器称为其数据源。

但是PickerView的数据源仅仅提供行数和列数,在代理方法内才能设置内容。

通过两个数据源方法设置行和列数,通过一个代理方法来设定内容,注意component表示第几列:

这里的foods成员是一个复合数组,即NSArray内又有多个NSArray,每个内层的NSArray中放着一个类型的食物,不同内层NSArray之间代表不同类型的食物。

要得到这样的复合数组,可以直接建立,例如:

@[@[...],@[...],@[...]];

或者通过plist读取,plist读取的方法在(二十七)QQ好友列表的实现的开头有提到。

#pragma mark - PickerView数据源方法

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return self.foods.count;
} // returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
NSArray *foodArray = self.foods[component]; // component是列
return foodArray.count;
} #pragma mark - PickerView代理方法 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return self.foods[component][row];
}

要监听选择,只需要再实现一个代理方法:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
NSString *name = self.foods[component][row];
switch (component) {
case 0:
self.fruitLabel.text = name;
break;
case 1:
self.mainLabel.text = name;
break;
case 2:
self.drinkLabel.text = name;
break;
default:
break;
}
}

一个细节:没有点选时的显示数据初始化:

间接利用上面的选择方法来初始化数据:每列都选中第0行,由于用不到pickerView本身,因此传入nil也无妨。

for (int i = 0; i < self.foods.count; i++) {
[self pickerView:nil didSelectRow:0 inComponent:i];
}

Tip:键盘上方常常用导航工具条,用于切换上一项、下一项等内容。

直接获取当前的选取项:selectRowInComponent: 传入列号可以得到选中的是第几行。

随机数:

arc4random()可以产生0或者正整数,要产生0 ~ (x-1)的随机数,应该使用 arc4random( ) % x。

关于选择层次的设计(选择左边右边变化),是由代码实现的(更换列的数据)。

需要用到reloadAllComponents或者reloadComponent:方法。

最新文章

  1. 《Kafka Stream》调研:一种轻量级流计算模式
  2. CentOS安装cacti
  3. Android6.0之来电转接号码显示修改
  4. C++与Lua交互(五)
  5. linux下nginx的安装
  6. jmeter 启用gzip压缩——解决测试中web服务器上行流量过大的问题
  7. 扩展pl0编译器设计——总述
  8. Delphi中ADO异步执行方式
  9. HDOJ 1163 Eddy&#39;s digital Roots 九余数定理+简单数论
  10. POJ1300(欧拉回路)
  11. [CLR via C#]5.2 引用类型和值类型
  12. Android基础知识笔记01—框架结构与四大组件
  13. Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解
  14. IIS Express
  15. mysql 5.1超过默认8小时空闲时间解决办法(错误:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure)
  16. Team Foundation Server (TFS)集成Flyway,实现数据库的版本管理
  17. MySQL 导出函数与存储过程
  18. 闲扯淡笔记 - Web的历史
  19. 20135208 JAVA第四次实验
  20. HSF源码剖析

热门文章

  1. MongoDB 关系
  2. 关于云Linux部署tomcat服务器(Maven的多模块war包)
  3. Ubuntu批量修改文件名后缀
  4. Scala:类,对象和特征(接口)
  5. Android通知Notification全面剖析
  6. Android使用shape制作圆形控件及添加弹跳动画
  7. Java集合-----java集合框架常见问题
  8. JBOSS EAP6 系列二 客户端访问位于EAR中的EJB时,jndi name要遵守的规则
  9. 如何优雅地退出python程序
  10. JRE System Library [JavaSE-1.7](unbound)