在文本字段点击上显示datepicker

时间:2012-10-10 21:10:32

标签: ios xcode uitextfield uidatepicker

我对iOS很陌生,所以在尝试按照此解决方案Display datepicker on tapping on textfield解决问题时,我显然缺少一些概念。

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

“在XIB中,拉出UIToolbar和UIDatePicker,但不要将其附加到视图。适当地连接插座.dateChanged:响应日期选择器中的更改和doneEditing:在完成时调用单击工具栏中的按钮。也可以连接它们。方法如下所示。“

我读过有关XIB的内容,但我正在使用故事板,所以我想我没有。此外,我不确定如何在不将其附加到视图控制器的情况下拉出元素(我正在尝试,但是当我释放鼠标按钮时,工具会飞回工具栏),我不知道甚至理解为什么我需要一个UIToolbar。

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

有人可以帮助我吗?

更新:

实际上它很简单,我只需要:

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

self.birthday.inputView = datePicker;

3 个答案:

答案 0 :(得分:52)

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

因此,如果您想在点击textField时显示UIDatePicker(即,您将该textField作为第一个响应者),那么您可以说,天真地:

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

[myTextField setInputView:datePicker];

现在,当您点击UITextField时,会提起UIDatePicker

无论其

你需要做的不仅仅是这个,因为你需要处理不同的方向和不同的习语。

但那是基本的想法。

(如果你想要UIDatePicker上方的工具栏,那就是inputAccessoryView属性的用途......)

答案 1 :(得分:21)

在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的出口

答案 2 :(得分:0)

在您的视图中添加datepicker视图和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];

因此,当视图加载时,它们将被隐藏,竞争视图的Y位于视图框之外。

现在你应该分配UITextFieldDelegate的属性委托

textfield.delegate = self;

在委托 textFieldDidBeginEditing 的方法中,请参阅UITextFieldDelegate,您应该触发将显示datePicker和工具栏的方法。 如果您有许多textFields来定义选择哪个,请使用标记属性,这是整数,您可以使用开关而不是许多 if 条件。

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

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

隐藏加上containerViewHeight变量。 您可以使用UIViewAnimations通过一些动画显示它。例如 UIViewAnimationCurveEaseInOut