22

我对 iOS 很陌生,所以显然我在尝试遵循此解决方案时缺少一些概念显示 datepicker on tap on textfield to my problem。

我在一个名为 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;
4

3 回答 3

54

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

因此,如果您希望 aUIDatePicker在您点击 textField 时出现(即,您使该 textField 成为第一响应者),那么您可以天真地说:

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

[myTextField setInputView:datePicker];

现在,当你UITextField被点击时,aUIDatePicker将被调出。

然而

你会想做更多的事情,因为你需要处理不同的方向和不同的习语。

但这是基本的想法。

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

于 2012-10-17T03:09:16.963 回答
21

ViewController.m的 viewDidLoad 中

- (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 的一个出口

于 2014-11-25T05:30:11.390 回答
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 来定义哪个被选中,请使用标签属性,它是整数,您可以使用switch而不是许多if条件。

要显示您的 datePicker 和工具栏,您应该更改 containerView 框架的 Y。这是如何做到这一点

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

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

于 2012-10-10T22:35:50.453 回答