2012-10-10 59 views
21

我对iOS很新,很显然,我试图按照这个解决方案Display datepicker on tapping on textfield来解决我的问题。在文本区域水龙头上显示日期选择器

我有一个名为DatepickerAppDelegate类的接口和实现,但我在这里失去了:

“在厦门国际银行,拉出一个UIToolbar和的UIDatePicker但不要将其连接到视图。 dateChanged:响应日期选择器和doneEditing中的变化:当工具栏中的Done按钮被点击时调用,也连接它们,方法实现如下:“

我读了一些关于XIB的内容,但我使用的是故事板,所以我认为我没有那么做。此外,我不知道我应该如何拉出元素,而不将其附加到我的视图控制器(我试着,但当我释放鼠标按钮,工具飞回工具栏),我不'甚至不明白为什么我需要一个UIToolbar。

最后,如何将我的文本字段连接到datepicker委托?

有人可以帮助我吗?

UPDATE:

其实是很简单的,我只需要:

datePicker = [[UIDatePicker alloc] init]; 
datePicker.datePickerMode = UIDatePickerModeDate; 
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 

self.birthday.inputView = datePicker; 

回答

51

UIResponder,从中UITextField继承,defines a property called inputView。当UIResponder成为第一响应者时,该属性(a UIView *)可以定义将显示而不是键盘的视图。

因此,如果你想有一个UIDatePicker当你在一个文本框挖掘出现(即,你作出这样的文本框的第一个响应者),那么你可以说,天真:

UIDatePicker *datePicker = [[UIDatePicker alloc] init...]; 
... configure datePicker ... 

[myTextField setInputView:datePicker]; 

现在,当你UITextField被挖掘,UIDatePicker将被提出。

无论其

你会想要做的比这更多,因为你需要处理不同方向和不同的成语。

但是这是基本的想法。

(如果你想在上面UIDatePicker一个工具栏,这就是inputAccessoryView属性是什么...)

+0

的出口这正是我做什么,但我忘了更新帖子。 – lolol

+0

根据这个答案,我写了一个开源类,[STADateField](https://github.com/Stunner/STAControls/blob/master/STAControls/STAControls/TextField/STADateField.h)。 – Stunner

0

添加日期选择器视图和uitoolbarview到您的视图。 例如

CGFloat toolbarHeight = 44.f; 
CGFloat datePickerHeight = 140.f; 
CGFloat containerViewHeight = toolbarHeight+datePickerHeight; 
//create container view for datepicker and toolbar 
UIView *containerView = [[UIVIew alloc] initWithFrame:CGRectMake(0.f, [self.view bounds].size.height+containerViewHeight, [self.view bounds].size.width, containerViewHeight)]; 

//after init toolbar set the frame 
toolBar.frame = CGRectMake(0.f,0.f,containerView.frame.size.width, toolbarHeight]; 
//then add on toolbar button save and release it after add 

//after init datePicker set the frame 
datePicker.frame = CGRectMake(0.f, toolbarHeight, containerView.frame.size.width, datePickerHeight); 

//add datePicker and toolBar to containerView 
[containerView addSubview: toolBar]; 
[containerView addSubview: datePicker]; 

[toolBar release]; 
[datePicker release]; 

//add containerView to main view 

[self.view addSubview: containerView]; 
[containerView release]; 

所以当视做负载它们会被隐藏contener鉴于Y为您的视图框架之外。

现在你应该分配财产委托UITextFieldDelegate

textfield.delegate = self; 

的在委托textFieldDidBeginEditing的方法看到UITextFieldDelegate你应该火法,将显示您的日期选择器和工具栏。 如果你有很多文本框来定义选择使用标签属性,它是整数,它是您可以使用开关,而不是许多如果条件。

要显示您的datePicker和工具栏,您应该更改containerView框架的Y. 这是怎么做的

CGRect containerViewFrame = containerView.frame; 
containerViewFrame.y -=containerViewHeight; 
containerView.frame = containerViewFrame; 

隐藏只是加上containerViewHeight变量。 您可以使用UIViewAnimations以某种动画显示它。例如UIViewAnimationCurveEaseInOut

20

viewDidLoad中ViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIDatePicker *datePicker = [[UIDatePicker alloc]init]; 
    [datePicker setDate:[NSDate date]]; 
    datePicker.datePickerMode = UIDatePickerModeDate; 
    [datePicker addTarget:self action:@selector(dateTextField:) forControlEvents:UIControlEventValueChanged]; 
    [txtFieldBranchYear setInputView:datePicker]; 
} 

添加一个方法在您的ViewController中

-(void) dateTextField:(id)sender 
{ 
    UIDatePicker *picker = (UIDatePicker*)txtFieldBranchYear.inputView; 
    [picker setMaximumDate:[NSDate date]]; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    NSDate *eventDate = picker.date; 
    [dateFormat setDateFormat:@"dd/MM/yyyy"]; 

    NSString *dateString = [dateFormat stringFromDate:eventDate]; 
    txtFieldBranchYear.text = [NSString stringWithFormat:@"%@",dateString]; 
} 

txtFieldBranchYear是的UITextField

+0

很棒的回答。简单一点:'txtFieldBranchYear.text = dateString;'也应该做这个工作。 –