当前位置: 代码迷 >> Iphone >> Iphone开发(7)date picker 和 picker view,较复杂的控件
  详细解决方案

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

热度:180   发布时间:2016-04-25 05:56:03.0
Iphone开发(七)date picker 和 picker view,较复杂的控件

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 plaincopy
?
  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 plaincopy
?
  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 plaincopy
?
  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 plaincopy
?
  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 plaincopy
?
  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文件中将代理和数据源拖拽对应。

?

关键字:Iphone IOS 开发 ,基础 ,入门 ,date picker ,picker View?

  相关解决方案