selector de fecha de visualización de iPhone en UITextField touch

Seguí este hilo: datepicker haciendo clic en el campo de texto

Importé ambos de los siguientes protocolos:

@interface ViewController : UIViewController { 

Luego, en la implementación, uso lo siguiente:

 - (void)viewDidLoad { textField.delegate = self; [super viewDidLoad] } 

Por último, puse el código real para mostrar el selector de fecha (del hilo). También lo relacioné todo en el IB.

  //Date Picker - (void)textFieldDidBeginEditing:(UITextField *)aTextField{ [aTextField resignFirstResponder]; pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 44, 0, 0)]; pickerView.datePickerMode = UIDatePickerModeDate; pickerView.hidden = NO; pickerView.date = [NSDate date]; UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; pickerToolbar.barStyle = UIBarStyleBlackOpaque; [pickerToolbar sizeToFit]; NSMutableArray *barItems = [[NSMutableArray alloc] init]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; [barItems addObject:flexSpace]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)]; [barItems addObject:doneBtn]; UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)]; [barItems addObject:cancelBtn]; [pickerToolbar setItems:barItems animated:YES]; [pickerViewPopup addSubview:pickerToolbar]; [pickerViewPopup addSubview:pickerView]; [pickerViewPopup showInView:self.view]; [pickerViewPopup setBounds:CGRectMake(0,0,320, 464)]; } -(void)doneButtonPressed:(id)sender{ //Do something here here with the value selected using [pickerView date] to get that value [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; } -(void)cancelButtonPressed:(id)sender{ [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; } 

Sin embargo, cuando hago clic en UITextField, obtengo esto:

enter image description here

¿Qué estoy haciendo mal?

Puede usar la propiedad de vista de entrada UITextField . Simplemente asigne un UIDatePicker regular en el código y asígnelo al inputView del campo de texto. Al hacer esto, se presentará UIPickerView lugar del teclado. Si necesita algún código, no dude en preguntar 🙂

EDITAR: código

Usted puño engancha su texto textField con IB

 @interface myViewController  @property (nonatomic,weak) IBOutlet UITextField *myTextField; @end 

En la implementación

 UIDatePicker *datePicker = [[UIDatePicker alloc]init]; [datePicker setDate:[NSDate date]]; [datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged]; [self.myTextField setInputView:datePicker]; 

Eso abrirá un UIDatePicker cuando toque en textField . Tenga en cuenta la acción que agregué al datePicker.

 [datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged]; 

Para actualizar el campo de texto cada vez que el usuario se desplaza en el selector, solo tiene que implementar el método updateTextField en algún lugar de viewController

 -(void)updateTextField:(id)sender { UIDatePicker *picker = (UIDatePicker*)self.myTextField.inputView; self.myTextField.text = [NSString stringWithFormat:@"%@",picker.date]; } 

¡Con este último método, cada vez que el usuario gira el selector, el campo de texto se actualizará!

  • Puede usar un NSDateFormatter para mejorar el resultado de la cadena.

A continuación se muestra cómo estoy mostrando el selector de fecha.

 - (void)textFieldDidBeginEditing:(UITextField *)textField { self.activeTextField = textField; // Create a date picker for the date field. UIDatePicker *datePicker = [[UIDatePicker alloc]init]; datePicker.datePickerMode = UIDatePickerModeDate; datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:-31536000]; [datePicker setDate:[NSDate date]]; [datePicker addTarget:self action:@selector(updateDateField:) forControlEvents:UIControlEventValueChanged]; // If the date field has focus, display a date picker instead of keyboard. // Set the text to the date currently displayed by the picker. if (textField.tag == 1) { self.date.inputView = datePicker; self.date.text = [self formatDate:datePicker.date]; } } // Called when the date picker changes. - (void)updateDateField:(id)sender { UIDatePicker *picker = (UIDatePicker*)self.date.inputView; self.date.text = [self formatDate:picker.date]; } // Formats the date chosen with the date picker. - (NSString *)formatDate:(NSDate *)date { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterShortStyle]; [dateFormatter setDateFormat:@"MM'/'dd'/'yyyy"]; NSString *formattedDate = [dateFormatter stringFromDate:date]; return formattedDate; } 

¡La solución @JRo funciona de maravilla!

Aquí está mi código actualizado en Swift 3:

 func textFieldDidBeginEditing(_ textField: UITextField) { self.activeTextField = textField // Create a date picker for the date field. let picker = UIDatePicker() picker.datePickerMode = .date picker.addTarget(self, action: #selector(updateDateField(sender:)), for: .valueChanged) // If the date field has focus, display a date picker instead of keyboard. // Set the text to the date currently displayed by the picker. textField.inputView = picker textField.text = formatDateForDisplay(date: picker.date) } // Called when the date picker changes. func updateDateField(sender: UIDatePicker) { activeTextField?.text = formatDateForDisplay(date: sender.date) } // Formats the date chosen with the date picker. fileprivate func formatDateForDisplay(date: Date) -> String { let formatter = DateFormatter() formatter.dateFormat = "dd MMM yyyy" return formatter.string(from: date) } 

Pase por este archivo en el archivo .h crear el objeto para UIDatePicker

 UIDatePicker *datePicker; 

en el archivo .m viewDidloadMethod

 datePicker = [[UIDatePicker alloc]init]; datePicker.datePickerMode = UIDatePickerModeDate; datePicker.minimumDate = [NSDate date]; [_dateTxtFld setInputView:datePicker]; UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; [toolBar setTintColor:[UIColor grayColor]]; UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(showSelectedDate)]; UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; [toolBar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]]; [_dateTxtFld setInputAccessoryView:toolBar]; 

después de eso puedes crear ShowSele

 -(void)showSelectedDate { if ([_dateTxtFld isFirstResponder]) { NSDateFormatter *formatter=[[NSDateFormatter alloc]init]; [formatter setDateFormat:@"YYYY-MM-dd"]; _dateTxtFld.text=[NSString stringWithFormat:@"%@",[formatter stringFromDate:datePicker.date]]; [_dateTxtFld resignFirstResponder]; } else if ([_timeTxtFld isFirstResponder]) { } } 

Es un trabajo para mi

Un buen enfoque es hacer tu propia clase (lo llamé TextFieldFormDate ) que se deriva de UITextField y encapsula todo el comportamiento requerido. En su guión gráfico, establece la clase para el campo de texto en TextFieldFormDate (en mi caso).

Utilice didChange y didSelect en su ViewController (que está usando TextFieldFormDate ) para recibir notificaciones de cambios y cuando la fecha realmente se selecciona.

 class TextFieldFormDate: UITextField { var date : Date { set { picker.date = newValue text = newValue.localizedDateOnly() } get { return picker.date } } //public handlers var didChange : ( (Date)->() )? var didSelect : ( (Date)->() )? private var picker : UIDatePicker { return inputView as! UIDatePicker } override func awakeFromNib() { super.awakeFromNib() setup() } private func setup() { font = UIFont.defaultFont() //picker for datefield inputView = UIDatePicker(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) picker.datePickerMode = .date picker.addTarget(self, action: #selector(pickerChanged), for: .valueChanged) let toolBar = UIToolbar() toolBar.tintColor = PaintCode.mainBlue toolBar.items = [ UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), BarBtnPaintCode(type: "done", target: self, action: #selector(didPressDone)) ] toolBar.sizeToFit() inputAccessoryView = toolBar } @objc private func pickerChanged() { text = date.localizedDateOnly() didChange?(picker.date) } @objc private func didPressDone() { text = date.localizedDateOnly() resignFirstResponder() didSelect?(picker.date) } }