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:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (retain, nonatomic) IBOutlet UIDatePicker *myDatePicker; @property (retain, nonatomic) IBOutlet UIButton *myButton; - (IBAction)click:(id)sender; @end
#import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize myDatePicker; @synthesize myButton; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)viewDidUnload { [self setMyDatePicker:nil]; [self setMyButton:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (void)dealloc { [myDatePicker release]; [myButton release]; [super dealloc]; } - (IBAction)click:(id)sender { NSString *tmpStr = [[NSString alloc]initWithFormat:@"格式化前的时间是%@",[myDatePicker date]]; //直接调用datePicker 的date方法取得NSDate的时间,做成字符串 //不格式化不准确,这里不演示了。 UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"显示时间" message:tmpStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil]; //AlertView弹出 [myAlert show]; [tmpStr release]; [myAlert release]; } @end
到现在date picker已经介绍了,有输出口就可以直接调用方法取出来时间 ,现在介绍比较复杂的picer view,在介绍之前先了解几个概念,在picker view中,样式类似于date picker,可以有若干个组件-component,也就是竖着的分栏,像date picker中的月日,时,分的分组,每一个component可以有多个row,这样就确定了一个picker View的结构,然后再按以上结构提供数据,就可以显示了,所以在加载picker view之前必须确定一下结构和数据,所以刚才我们明明拖了一个picker View上去却没有显示。怎样来显示一个picker view呢。用三个方法来确定:
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { //该方法来自协议<UIPickerViewDataSource> //该方法用来确定pickerView有几个component; } -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { //该方法来自协议<UIPickerViewDataSource> //该方法来确定每一个component中有多少个row,即多少行 //可以理解为每一个竖排中有多少个横排。 } -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { //该方法来自协议<UIPickerViewDelegate> //三个参数,第一个参数表示确定是哪一个pickerView //第二个参数表示哪一行 //第三个参数表示哪一个component。 }
现在我们创建一个只有一个component的picker View,需要创建一个字符串数组来显示每一行的内容,然后将这三个方法在代码中补充完全,并在button事件中添加对picker View的响应用以测试。然后三个方法和响应方法都完成后在xib文件中将picker View右边的输出口对应拖拽到file's owner中,将数据源和代理与picker View关联起来。
viewController.h:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource> @property (retain, nonatomic) IBOutlet UIDatePicker *myDatePicker; @property (retain, nonatomic) IBOutlet UIButton *myButton; - (IBAction)click:(id)sender; @property (retain, nonatomic) IBOutlet UIPickerView *myPickerView; @property (retain, nonatomic) NSArray *myStringArray; //创建一个字符串数组用来提供picker View的显示内容。 @end
#import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize myPickerView; @synthesize myDatePicker; @synthesize myButton; @synthesize myStringArray; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //MVC是不提倡在委托中处理数据的,所以我们将myStringArray的赋值放到这里 myStringArray = [[NSArray alloc]initWithObjects:@"吃饭",@"睡觉",@"打豆豆",nil]; } - (void)viewDidUnload { [self setMyDatePicker:nil]; [self setMyButton:nil]; [self setMyPickerView:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (void)dealloc { [myDatePicker release]; [myButton release]; [myPickerView release]; [super dealloc]; } - (IBAction)click:(id)sender { NSInteger selectedRow=[myPickerView selectedRowInComponent:0]; //当前picker View选择的行号 NSString *tmpStr = [[NSString alloc]initWithFormat:@"格式化前的时间是%@,选择的picker View内容是%@",[myDatePicker date],[myStringArray objectAtIndex:selectedRow]]; //注意这里是从字符串(数据源)中取的字符串,不是在picker View中取的。 //直接调用datePicker 的date方法取得NSDate的时间,做成字符串 //不格式化不准确,这里不演示了。 UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"显示时间" message:tmpStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil]; //AlertView弹出 [myAlert show]; [tmpStr release]; [myAlert release]; } -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { //该方法来自协议<UIPickerViewDataSource> //该方法用来确定pickerView有几个component; //我们只创造一个component,只需要返回1就行了 return 1; } -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { //该方法来自协议<UIPickerViewDataSource> //该方法来确定每一个component中有多少个row,即多少行 //可以理解为每一个竖排中有多少个横排。 //因为只有一个component,所以我们就不需要if判断了 //直接返回字符串数组的元素个数,就是我们的行数了 return [myStringArray count]; } -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { //该方法来自协议<UIPickerViewDelegate> //三个参数,第一个参数表示确定是哪一个pickerView //第二个参数表示哪一行 //第三个参数表示哪一个component。 //同样不用判断,数组和row完全对照 return [myStringArray objectAtIndex:row]; } @end
测试看效果:
好了,这样就大概了解了picker View的实现了,将要点再过一下:
1,要实现两个协议,协议中对应的三个方法分别描述了picker View的component,row ,和显示的内容。
2,picker View的显示内容是从数组中取得的,在取时也要从数组中取。
3,存储picker View显示信息的字符串往往在viewDidLoad方法中进行初始化。
4,要记得在xib文件中将代理和数据源拖拽对应。
关键字:Iphone IOS 开发 ,基础 ,入门 ,date picker ,picker View