iOS7 学习笔记--UIPickerView

UIPickerView的功能是让用户从一系列待选的值中选取一个他们取需要的值,iPhone闹钟的计时器就使用了UIPickerView来选择时间。

UIPickerView的用法很简单,即初始化->选择数据源->选择委托对象->显示。

IOS使用MVC模式构建App,将视图与模型分开,通过控制器来沟通。UIPickerView就是MVC中的View,要展示的数据属于Model,而数据源就是Control了。UIPickerView的数据源必须遵守一个协议:UIPickerViewDataSource,并且实现其中的两个方法:

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

一个UIPickerView可以有多个组件(Component),每个组件提供了一列值让用户选择,例如计时器中有小时和分钟两个组件。上面的两个方法确定了UIPickerView中的组件个数以及每个组件中的行数,即一个组件中待选择的值的个数,但是每一行具体代表什么值并没有确定,此时每一行都显示‘?’。这时我们需要再提供一个委托对象给UIPickerView,一个委托对象在MVC中也属于Control,它要遵守UIPickerViewDelegate协议,并且实现协议中的一个方法:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;

这个方法可以返回某个UIPickerView中的某个组件的某一行显示的字符串。

UIPickerView中有一个属性showsSelectionIndicator,用来突出当前选择的行,ios7中即在中间增加两条横线来确定当前选定的行,以前的版本是增加一个选定框,官房文档中这个属性的默认值是NO,可以直接将它赋值成YES或者调用SetShowsSelectionIndicator:方法。但是我修改这个属性时发现并没有什么变化,网上查了官方文档,原来ios7中这个属性已经无效了。如果想去掉这两条线,可以调用

如果想要知道用户当前选择了某个组件的哪一行,可以调用方法:selectedRowInComponent:,该方法返回当前行的下标。如果想要动态更新组件显示的数据,可以让需要更新的组件调用reload它的数据或者让所有组件reload它们的数据,这时需要调用以下两个方法:

[[self.pickerView.subviews objectAtIndex:1] setHidden:TRUE];

[[self.pickerView.subviews objectAtIndex:2] setHidden:TRUE];

因为UIPickerView的subview有三层,下标为0的一层显示Component,下标为1和2的两层显示两条横线,但是最好不要这样做。


// Reloading whole view or single component
- (void)reloadAllComponents;
- (void)reloadComponent:(NSInteger)component;

下面贴上我的代码:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.pickerView = [[UIPickerView alloc]init];
self.pickerView.center = self.view.center;
self.pickerView.dataSource = self;
self.pickerView.delegate = self;
[self.view addSubview:self.pickerView];
}

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
if ([pickerView isEqual:self.pickerView]) {
return 2;
}
return 0;
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
if ([pickerView isEqual:self.pickerView]) {
if (component == 0) {
return 12;
}else{
return 30;
}
}
return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
if ([pickerView isEqual:self.pickerView]) {
if (component == 0) {
return [NSString stringWithFormat:@"Mon %ld",row+1];
}else{
return [NSString stringWithFormat:@"Day %ld",row+1];
}
}
return nil;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值