在点击文本字段时显示日期选择器
Posted
技术标签:
【中文标题】在点击文本字段时显示日期选择器【英文标题】:Display datepicker on tapping on textfield 【发布时间】:2011-08-29 19:14:51 【问题描述】:如何在点击文本框时显示 datetimepicker 控件?
我有一个包含到达和离开文本字段的用户界面,当用户点击到达文本框时,它应该会弹出一个 datetimepicker 控件而不是键盘,并且与离开文本框相同。
【问题讨论】:
【参考方案1】:您可以为此使用文本字段的inputView
和inputAccessoryView
属性。创建日期选择器并将其设置为两个文本字段的输入视图。还为Done
按钮创建另一个视图,并将其作为附件视图。您将需要该按钮来关闭输入视图。
Done
按钮必须连接到基本上执行此操作的功能 -
if ( [textField1 isFirstResponder] )
[textField1 resignFirstResponder];
else if ( [textField2 isFirstResponder] )
[textField2 resignFirstResponder];
另一种选择是继承UITextField
并覆盖inputView
和inputAccessoryView
。当有大量它们时,这是要走的路。
示例
@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 中,拉出 UIToolbar
和 UIDatePicker
,但不要将其附加到视图。正确连接插座。 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)
【讨论】:
重复另一个答案以上是关于在点击文本字段时显示日期选择器的主要内容,如果未能解决你的问题,请参考以下文章