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

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

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

【问题讨论】:

    标签: ios4 xcode4 uitextfield uidatepicker


    【解决方案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,至少对于我所做的,正是我所需要的。

    【讨论】:

    【解决方案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)
    
    
    }
    

    【讨论】:

    • 重复另一个答案
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2015-06-23
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多