在写日期选择器之前 我们必须准备几个成员变量(至少要下面几个)
UIToolbar *mToolBar; //工具栏
UIDatePicker *mDatePickerView; //日期的View
UIPickerView *mPickerView; //日期+ToolBar的View
UITextField *_responseTextField; //保存当前的TextField 用于取消第一响应
NSArray *pickerViewDataSourse; //数据源
UITextField *mTextField; //当前的文本输入框 点击选择日期
成员变量定义好之后 我一般是在ViewDidLoad中掉两个方法 一个是加载UI 另外一个是加载选择器 代码如下 (这段代码我加了个Label作为成为变量 可直接编译)
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor = [UIColorgrayColor];
[self initUi];
[selfsetPickerView];
}
- (void)initUi
{
UIView *back = [[UIViewalloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height-20)];
back.backgroundColor = [UIColorcyanColor];
_mTitleLabel = [[UILabelalloc]initWithFrame:CGRectMake(15,105, 60,30)];
_mTitleLabel.textAlignment =NSTextAlignmentRight;
_mTitleLabel.text =@"helloWorld";
_mTitleLabel.backgroundColor = [UIColorclearColor];
_mTitleLabel.font = [UIFontsystemFontOfSize:15];
_mTitleLabel.adjustsFontSizeToFitWidth=YES;
_mTextField = [[UITextFieldalloc]initWithFrame:CGRectMake(75,105, 150,30)];
_mTextField.backgroundColor = [UIColorclearColor];
_mTextField.returnKeyType =UIReturnKeyDone;
_mTextField.borderStyle =UITextBorderStyleRoundedRect;
_mTextField.font = [UIFontsystemFontOfSize:15];
_mTextField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;
_mTextField.delegate =self;
[self.view addSubview:back];
[self.viewaddSubview:_mTitleLabel];
[self.viewaddSubview:_mTextField];
}
- (void)setPickerView
{
self.mPickerView = [[UIPickerViewalloc] init];
_mPickerView.dataSource =self;
_mPickerView.delegate =self;
self.mToolBar = [[UIToolbaralloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width,40)];
_mToolBar.barStyle =UIBarStyleDefault;
UIBarButtonItem *done = [[UIBarButtonItemalloc] initWithTitle:@"完成"style:UIBarButtonItemStyleDone target:self action:@selector(doneAction:)];
UIBarButtonItem *fexible = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpacetarget:selfaction:nil];
UIBarButtonItem *cancel = [[UIBarButtonItemalloc] initWithTitle:@"取消"style:UIBarButtonItemStyleDone target:self action:@selector(cancelAction:)];
_mToolBar.items = [NSArrayarrayWithObjects:cancel, fexible, done, nil];
self.mTextField.inputView =_mPickerView;
self.mTextField.inputAccessoryView =_mToolBar;
_mDatePickerView = [[UIDatePickeralloc]initWithFrame:CGRectMake(0, [UIScreenmainScreen].bounds.size.height -216,self.view.frame.size.height,216)];
_mDatePickerView.backgroundColor = [UIColormagentaColor];
_mDatePickerView.datePickerMode =UIDatePickerModeDate;
//定义最小日期
NSDateFormatter *formatter_minDate = [[NSDateFormatteralloc]init];
[formatter_minDate setDateFormat:@"yyyy-MM-dd"];
NSDate *minDate = [formatter_minDate dateFromString:@"1900-01-01"];
formatter_minDate = nil;
//最大日期是今天
NSDate *maxDate = [NSDatedate];
[_mDatePickerView setMinimumDate:minDate];
[_mDatePickerView setMaximumDate:maxDate];
_mPickerView = [[UIPickerViewalloc] initWithFrame:CGRectMake(0,self.view.frame.size.height-216-40,self.view.frame.size.width,216)];
_mPickerView.delegate =self;
_mPickerView.backgroundColor = [UIColormagentaColor];
_mPickerView.dataSource =self;
_mPickerView.showsSelectionIndicator =YES;
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
/* NSDate *date_one = [NSDatedate];
_mTextField.text = [formatterstringFromDate:date_one]; */
这样会有8小时的时差
应改为 :
NSDate *date = [NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate: date];
NSDate *nowDate = [date dateByAddingTimeInterval: interval];
_mTextField.text = [formatter stringFromDate:nowDate];
formatter = nil;
_mTextField.inputAccessoryView =_mToolBar;
_mTextField.inputView =_mDatePickerView;
}
- (void)doneAction:(UIBarButtonItem *)btn
{
NSDate *date_one =_mDatePickerView.date;
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
_mTextField.text = [formatterstringFromDate:date_one];
formatter = nil;
[_responseField resignFirstResponder];
}
- (void)cancelAction:(UIBarButtonItem *)btn
{
[_responseField resignFirstResponder];
}
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
_responseField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[_responseField resignFirstResponder];
}
#pragma mark -------pickerView-----Dalegate------
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
returnself.view.frame.size.width;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 40;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [_pickerViewDataSourseobjectAtIndex:row];
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return_pickerViewDataSourse.count;
}
#pragma mark ----DataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
代码大致说一下 toolBar上又两个功能按钮 一个是完成 另外一个是取消 点击TextField会弹出日期选择器 选择好只好 点击完成(可选定选择好的日期) 取消第一响应
数据 都是通过数据源提供的 可是是本地的plist文件 可以使自带的日期 可以使自己在代码中写的 等等 TextField的两个代理方法 我一般是用来管理第一响应的 感觉比较方便
好了 不扯了 具体的都在code中表现出来了 自己看吧