Iphone开发(七)date picker 和 picker view,较复杂的控件

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7408703


Iphone中的时间选择器比较有特色,有点儿类似老虎机的感觉,这也是Iphone开发中比较难的一个控件,这种样式的控件有两种,一种是date picker,另一种是picker view.其中前者比较好用,当作一个常用的控件,只要有输出口,就能用这个对象随时取出date,后者则是一个比较复杂的view,可以显示我们自定义的内容。需要实现两个协议才能进行操作提取数据,现在我们先新建一个项目后画出一个界面,包括一个date picker,一个picker view。中间是一个button,用来显示当前picker上的信息。


然后先研究date picker,将button和date picker的输出口声明出来,再声明一个操作方法用来响应button的点击事件,就称为click方法吧,然后在该方法中可以直接用date picker的对象取得一个NSDate的对象,然后建一个alertview将其显示出来,看代码:

viewController.h:

[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController  
  4. @property (retain, nonatomic) IBOutlet UIDatePicker *myDatePicker;  
  5. @property (retain, nonatomic) IBOutlet UIButton *myButton;  
  6. - (IBAction)click:(id)sender;  
  7.   
  8. @end  

viewController.m:
[plain] view plain copy
  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8. @synthesize myDatePicker;  
  9. @synthesize myButton;  
  10.   
  11. - (void)viewDidLoad  
  12. {  
  13.     [super viewDidLoad];  
  14.     // Do any additional setup after loading the view, typically from a nib.  
  15. }  
  16.   
  17. - (void)viewDidUnload  
  18. {  
  19.     [self setMyDatePicker:nil];  
  20.     [self setMyButton:nil];  
  21.     [super viewDidUnload];  
  22.       
  23.     // Release any retained subviews of the main view.  
  24. }  
  25.   
  26. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  27. {  
  28.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  29. }  
  30.   
  31. - (void)dealloc {  
  32.     [myDatePicker release];  
  33.     [myButton release];  
  34.     [super dealloc];  
  35. }  
  36. - (IBAction)click:(id)sender {  
  37.     NSString *tmpStr = [[NSString alloc]initWithFormat:@"格式化前的时间是%@",[myDatePicker date]];  
  38.     //直接调用datePicker 的date方法取得NSDate的时间,做成字符串  
  39.     //不格式化不准确,这里不演示了。  
  40.     UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"显示时间" message:tmpStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil];  
  41.     //AlertView弹出  
  42.     [myAlert show];  
  43.     [tmpStr release];  
  44.     [myAlert release];  
  45. }  
  46. @end  

上面主要是最后一个方法的实现,很简单吧。看效果:

到现在date picker已经介绍了,有输出口就可以直接调用方法取出来时间 ,现在介绍比较复杂的picer view,在介绍之前先了解几个概念,在picker view中,样式类似于date picker,可以有若干个组件-component,也就是竖着的分栏,像date picker中的月日,时,分的分组,每一个component可以有多个row,这样就确定了一个picker View的结构,然后再按以上结构提供数据,就可以显示了,所以在加载picker view之前必须确定一下结构和数据,所以刚才我们明明拖了一个picker View上去却没有显示。怎样来显示一个picker view呢。用三个方法来确定:

[plain] view plain copy
  1. -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView  
  2. {  
  3.     //该方法来自协议<UIPickerViewDataSource>  
  4.     //该方法用来确定pickerView有几个component;  
  5.       
  6. }  
  7. -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component  
  8. {  
  9.     //该方法来自协议<UIPickerViewDataSource>  
  10.     //该方法来确定每一个component中有多少个row,即多少行  
  11.     //可以理解为每一个竖排中有多少个横排。  
  12.       
  13.       
  14. }  
  15. -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component  
  16. {  
  17.     //该方法来自协议<UIPickerViewDelegate>  
  18.     //三个参数,第一个参数表示确定是哪一个pickerView  
  19.     //第二个参数表示哪一行  
  20.     //第三个参数表示哪一个component。  
  21.       
  22. }  

由此可见,在这三个方法中才构造了一个具体的picker View,为了在viewController.m中实现这三个方法,需要实现那两个协议,协议名真的很形象,标准也很统一,很好记的。

现在我们创建一个只有一个component的picker View,需要创建一个字符串数组来显示每一行的内容,然后将这三个方法在代码中补充完全,并在button事件中添加对picker View的响应用以测试。然后三个方法和响应方法都完成后在xib文件中将picker View右边的输出口对应拖拽到file's owner中,将数据源和代理与picker View关联起来。

viewController.h:

[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>  
  4. @property (retain, nonatomic) IBOutlet UIDatePicker *myDatePicker;  
  5. @property (retain, nonatomic) IBOutlet UIButton *myButton;  
  6. - (IBAction)click:(id)sender;  
  7. @property (retain, nonatomic) IBOutlet UIPickerView *myPickerView;  
  8. @property (retain, nonatomic) NSArray *myStringArray;  
  9. //创建一个字符串数组用来提供picker View的显示内容。  
  10.   
  11. @end  

viewController.m:
[plain] view plain copy
  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8. @synthesize myPickerView;  
  9. @synthesize myDatePicker;  
  10. @synthesize myButton;  
  11. @synthesize myStringArray;  
  12.   
  13. - (void)viewDidLoad  
  14. {  
  15.     [super viewDidLoad];  
  16.     // Do any additional setup after loading the view, typically from a nib.  
  17.     //MVC是不提倡在委托中处理数据的,所以我们将myStringArray的赋值放到这里  
  18.     myStringArray = [[NSArray alloc]initWithObjects:@"吃饭",@"睡觉",@"打豆豆",nil];  
  19.       
  20. }  
  21.   
  22. - (void)viewDidUnload  
  23. {  
  24.     [self setMyDatePicker:nil];  
  25.     [self setMyButton:nil];  
  26.     [self setMyPickerView:nil];  
  27.     [super viewDidUnload];  
  28.       
  29.     // Release any retained subviews of the main view.  
  30. }  
  31.   
  32. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  33. {  
  34.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  35. }  
  36.   
  37. - (void)dealloc {  
  38.     [myDatePicker release];  
  39.     [myButton release];  
  40.     [myPickerView release];  
  41.     [super dealloc];  
  42. }  
  43. - (IBAction)click:(id)sender {  
  44.     NSInteger selectedRow=[myPickerView selectedRowInComponent:0];  
  45.     //当前picker View选择的行号  
  46.     NSString *tmpStr = [[NSString alloc]initWithFormat:@"格式化前的时间是%@,选择的picker View内容是%@",[myDatePicker date],[myStringArray objectAtIndex:selectedRow]];  
  47.     //注意这里是从字符串(数据源)中取的字符串,不是在picker View中取的。  
  48.     //直接调用datePicker 的date方法取得NSDate的时间,做成字符串  
  49.     //不格式化不准确,这里不演示了。  
  50.     UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"显示时间" message:tmpStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil];  
  51.     //AlertView弹出  
  52.       
  53.     [myAlert show];  
  54.       
  55.     [tmpStr release];  
  56.     [myAlert release];  
  57. }  
  58. -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView  
  59. {  
  60.     //该方法来自协议<UIPickerViewDataSource>  
  61.     //该方法用来确定pickerView有几个component;  
  62.     //我们只创造一个component,只需要返回1就行了  
  63.     return 1;  
  64.       
  65. }  
  66. -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component  
  67. {  
  68.     //该方法来自协议<UIPickerViewDataSource>  
  69.     //该方法来确定每一个component中有多少个row,即多少行  
  70.     //可以理解为每一个竖排中有多少个横排。  
  71.     //因为只有一个component,所以我们就不需要if判断了  
  72.     //直接返回字符串数组的元素个数,就是我们的行数了  
  73.     return [myStringArray count];  
  74.       
  75. }  
  76. -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component  
  77. {  
  78.     //该方法来自协议<UIPickerViewDelegate>  
  79.     //三个参数,第一个参数表示确定是哪一个pickerView  
  80.     //第二个参数表示哪一行  
  81.     //第三个参数表示哪一个component。  
  82.     //同样不用判断,数组和row完全对照  
  83.     return [myStringArray objectAtIndex:row];  
  84.       
  85. }  
  86. @end  


测试看效果:


好了,这样就大概了解了picker View的实现了,将要点再过一下:

1,要实现两个协议,协议中对应的三个方法分别描述了picker View的component,row ,和显示的内容。

2,picker View的显示内容是从数组中取得的,在取时也要从数组中取。

3,存储picker View显示信息的字符串往往在viewDidLoad方法中进行初始化。

4,要记得在xib文件中将代理和数据源拖拽对应。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值