在点击文本字段时显示日期选择器

Posted

技术标签:

【中文标题】在点击文本字段时显示日期选择器【英文标题】:Display datepicker on tapping on textfield 【发布时间】:2011-08-29 19:14:51 【问题描述】:

如何在点击文本框时显示 datetimepicker 控件?

我有一个包含到达和离开文本字段的用户界面,当用户点击到达文本框时,它应该会弹出一个 datetimepicker 控件而不是键盘,并且与离开文本框相同。

【问题讨论】:

【参考方案1】:

您可以为此使用文本字段的inputViewinputAccessoryView 属性。创建日期选择器并将其设置为两个文本字段的输入视图。还为Done 按钮创建另一个视图,并将其作为附件视图。您将需要该按钮来关闭输入视图。

Done 按钮必须连接到基本上执行此操作的功能 -

if ( [textField1 isFirstResponder] ) 
    [textField1 resignFirstResponder];
 else if ( [textField2 isFirstResponder] ) 
    [textField2 resignFirstResponder];

另一种选择是继承UITextField 并覆盖inputViewinputAccessoryView。当有大量它们时,这是要走的路。

示例

@interface CustomKeyboardAppDelegate : NSObject <UIApplicationDelegate> 
...

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UIToolbar *accessoryView;
@property (nonatomic, retain) IBOutlet UIDatePicker *customInput;

- (IBAction)dateChanged:(id)sender;
- (IBAction)doneEditing:(id)sender;
@end

在 XIB 中,拉出 UIToolbarUIDatePicker,但不要将其附加到视图。正确连接插座。 dateChanged: 响应日期选择器中的更改,并在单击工具栏中的 Done 按钮时调用 doneEditing:。也连接它们。这些方法的实现如下所列。

@implementation CustomKeyboardAppDelegate

@synthesize window=_window;
@synthesize textField = _textField;
@synthesize accessoryView = _accessoryView;
@synthesize customInput = _customInput;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.textField.inputView = self.customInput;
    self.textField.inputAccessoryView = self.accessoryView;
    ...    


...

- (IBAction)dateChanged:(id)sender 
    UIDatePicker *picker = (UIDatePicker *)sender;

    self.textField.text = [NSString stringWithFormat:@"%@", picker.date];


- (IBAction)doneEditing:(id)sender 
    [self.textField resignFirstResponder];

@end

随着更多的文本字段依赖于这个选择器,最后两种方法会膨胀。

【讨论】:

感谢您的回答。您能告诉我如何创建日期选择器并将其设置为输入视图吗?这是我必须在 Interface Builder 中还是通过代码执行的操作? 添加了单个文本字段的示例。你可以像我一样通过 IB 做到这一点。 非常感谢@Deepak 的帮助。我真的很感激。我也想投票给你,但不幸的是,这需要 15 个声望:( @Deepak 工具栏应该如何设置?在我的 Xcode 版本中,工具栏以它上面的按钮(“Item”)开头,它没有链接到任何东西,也没有调用 dateChanged 或 doneEditing。 @Deepak “不要将其附加到视图”是什么意思?我遵循您的代码,除了在视图出现时出现在我的视图中的 DatePicker 之外,它工作正常。如何在启动时隐藏它?非常感谢。【参考方案2】:

非常简单,在ViewController.h 中将UITextFieldDelegate 放在viewDidLoad 之后。

txtFecha.delegate = self;

datePicker = [[UIDatePicker alloc]init];
[datePicker setDatePickerMode:UIDatePickerModeDate];

self.txtFecha.inputView = datePicker;

【讨论】:

为什么要设置委托?在我的情况下,它可以在没有它的情况下工作。 是的,选择器正在显示,但“完成”和取消按钮没有显示该日期选择器。【参考方案3】:

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

【讨论】:

这对我来说是正确的解决方案。适用于 8.2。但是我可能会删除: [picker setMaximumDate:[NSDate date]];以防止混淆。【参考方案4】:

我发现了一个非常有用的类 - 博客文章在这里:http://www.pietrorea.com/2012/07/how-to-hide-the-cursor-in-a-uitextfield/ 但它基本上也使用 inputView/inputAccessory 视图。更重要的是,UILabel,至少对于我所做的,正是我所需要的。

【讨论】:

您提供的链接已损坏 链接好像坏了。我在这里找到了一个要点,其中的代码来自文章:gist.github.com/mjjimenez/7132551【参考方案5】:

点击 textField swift 3.0 打开日期选择器 添加 UITextFieldDelegate 和 在 ViewDidload() 上设置委托 tfDate.delegate = self

//MARK:- TextField Delegate
//MARK:-

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    textField.resignFirstResponder()
    return true


//MARK:- DatePicker
//MARK:-

func textFieldDidBeginEditing(_ textField: UITextField) 
     self.callDatePicker(textField: tfDate)

func callDatePicker(textField:UITextField)
    let datePickerView  : UIDatePicker = UIDatePicker()
    datePickerView.datePickerMode = UIDatePickerMode.date
    textField.inputView = datePickerView
    datePickerView.addTarget(self, action: #selector(MyViewController.handleDatePicker), for: .valueChanged)


var str:String = ""
var str1:String = ""
var strStartDate:Date!
var strEndDate:Date!

func handleDatePicker(sender: UIDatePicker) 

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    print("Date :: \(dateFormatter.string(from: sender.date))")
    tfDate.text = dateFormatter.string(from: sender.date)



【讨论】:

重复另一个答案

以上是关于在点击文本字段时显示日期选择器的主要内容,如果未能解决你的问题,请参考以下文章

在输入字段单击时显示 JQuery UI 日期选择器?

日期选择器视图超小 - Swift Xcode

如何在按钮单击时显示日期选择器?

日期选择器仅在聚焦时显示错误

自定义表格视图单元格中的 UITextField。点击单元格/文本字段时显示选择器视图

Telerik rad 日期选择器在用户键入未来日期时显示错误消息