如何将生日日期UIDatePicker添加到UITextField中?

6

在我的应用程序的注册界面上,我需要请求用户的出生日期。我无法弄清楚如何显示一个UIDatePicker来获取出生日期。我尝试使用以下代码,但它只显示日期和时间:

 UIDatePicker *dp = [[UIDatePicker alloc]init];
_textBirthday.inputView = dp;

此外,我如何设置它,使其仅接受在特定年份之后出生的用户?

UIDatePickerminimumData 属性是什么? - Larme
1
“而你所说的‘它只显示日期和时间’是什么意思?你想要它显示什么?” - André Slotta
3个回答

19

1)在你的视图控制器(.h文件)中,确保你分配了文本框委托:

@interface YourViewController : UIViewController <UITextFieldDelegate>

同时还需要在生日文本字段中拥有一个IBOutlet。

2) 将日期选择器声明为类变量,以使其可以从类中的所有不同方法中访问。在导入之后,在.m文件中实现以下操作:

@interface YourViewController () {
UIDatePicker *datePicker;
}
@end

3)在viewdidload中:

// make the textfield its own delegate
self.BirthdateTextfield.delegate = self;

// alloc/init your date picker, and (optional) set its initial date
datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]]; //this returns today's date

// theMinimumDate (which signifies the oldest a person can be) and theMaximumDate (defines the youngest a person can be) are the dates you need to define according to your requirements, declare them:

// the date string for the minimum age required (change according to your needs) 
NSString *maxDateString = @"01-Jan-1996";
// the date formatter used to convert string to date
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// the specific format to use
dateFormatter.dateFormat = @"dd-MMM-yyyy";
// converting string to date
NSDate *theMaximumDate = [dateFormatter dateFromString: maxDateString];

// repeat the same logic for theMinimumDate if needed

// here you can assign the max and min dates to your datePicker 
[datePicker setMaximumDate:theMaximumDate]; //the min age restriction 
[datePicker setMinimumDate:theMinimumDate]; //the max age restriction (if needed, or else dont use this line)

// set the mode
[datePicker setDatePickerMode:UIDatePickerModeDate];

// update the textfield with the date everytime it changes with selector defined below
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];

// and finally set the datePicker as the input mode of your textfield
[self.BirthdateTextfield setInputView:datePicker];

4) 在同一.m文件中,定义选择器,以便在日期选择器更改时更新文本字段:

-(void)updateTextField:(id)sender {
    UIDatePicker *picker = (UIDatePicker*)self.BirthdateTextfield.inputView;
    self.BirthdateTextfield.text = [self formatDate:picker.date];
}

5) 最后但同样重要的是,这是在将日期分配给textfield.text之前调用的方法(textfield.text需要一个字符串而不是日期):

- (NSString *)formatDate:(NSDate *)date {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateFormat:@"dd-MMM-yyyy"];
    NSString *formattedDate = [dateFormatter stringFromDate:date];
    return formattedDate;
}

享受编码!


1
哦,我的错!在所有的视图控制器中,我都习惯于使用一个名为“Helper”的单例辅助类来轻松访问这些常用方法。在这种情况下,formatDate接受NSDate并返回NSString。我会编辑我的答案,以便您可以将其包含在您的视图控制器中。 - carlos16196
@carlos16196 感谢您提供详细的答案,不幸的是,我在代码中遇到了一些错误 i.imgur.com/0EXr9HP.png - George
没问题,@George。我刚刚更新了我的答案,包括你可能需要解决错误的所有细节。它们基本上只是声明和定义变量的问题。希望我的更新后的答案更有意义。请在你的代码运行成功后回来投票支持我的答案。 - carlos16196
确实..我只是随手写了这个代码,没有测试过,实际上只是一个小错误,我之前用了[NSDate date]来设置今天的日期作为最大日期。现在我们不再需要[NSDate date],只需使用setMaximumDate:theMaximumDate即可。我已经修改了代码,现在一切应该都可以完美运行了。 - carlos16196
1
我知道导致这种行为的唯一属性是文本字段的secureTextEntry值,我们会用它来处理密码。请检查您的界面构建器,确保您没有在属性检查器选项卡中错误地勾选它,或者搜索您的代码,确保您没有将出生日期文本字段与密码文本字段混淆。您还可以在viewDidAppear中强制将该属性设置为NO,如下所示: self.BirthdateTextfield.secureTextEntry = NO; - carlos16196
显示剩余3条评论

1
使用以下代码,您将自动获得输出:
- (void)viewDidLoad {
[super viewDidLoad];

UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker addTarget:self action:@selector(dateTextField:) forControlEvents:UIControlEventValueChanged];
[self.dobTextField setInputView:datePicker];
}

-(void) dateTextField:(id)sender{
 UIDatePicker *picker = (UIDatePicker*)self.dobTextField.inputView;
[picker setMaximumDate:[NSDate date]];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSDate *eventDate = picker.date;
[dateFormat setDateFormat:@"dd/MM/yyyy"];
NSString *dateString = [dateFormat stringFromDate:eventDate];
self.dobTextField.text = [NSString stringWithFormat:@"%@",dateString];
}

这是Swift 4的代码:
override func viewDidLoad() {
    super.viewDidLoad()
  showDatePicker()
}

//MARK: Show Date Picker
func showDatePicker(){
    //Formate Date
    datePicker.datePickerMode = .date
    //ToolBar
    let toolbar = UIToolbar();
    toolbar.sizeToFit()
    //done button & cancel button
    let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker))
    let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker))

    toolbar.setItems([cancelButton,spaceButton,doneButton], animated: false)

    // add toolbar to textField
    dateOfBirthTxtFldRef.inputAccessoryView = toolbar
    // add datepicker to textField
    dateOfBirthTxtFldRef.inputView = datePicker
}

@objc func donedatePicker(){
    //For date formate
    let formatter = DateFormatter()
    formatter.dateFormat = "dd MMMM yyyy"
    dateOfBirthTxtFldRef.text! = formatter.string(from: datePicker.date)
    //dismiss date picker dialog
    self.view.endEditing(true)
}

@objc func cancelDatePicker(){
    //cancel button dismiss datepicker dialog
    self.view.endEditing(true)
}

0
datePickerMode设置为UIDatePickerModeDate
datePicker.datePickerMode = UIDatePickerModeDate;
Apple Docs:日期选择器显示月份、每月的天数和年份。这些项目的确切顺序取决于区域设置。此模式的示例为 [ November | 15 | 2007 ]。适用于 iOS 2.0 及更高版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接