Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone display date picker on UITextField touch

I followed this thread: datepicker by clicking on textfield

I imported both of the following protocols:

@interface ViewController : UIViewController<UIActionSheetDelegate, UITextFieldDelegate> { 

Then, in the implementation, I use the following:

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

Lastly, I put the actual code to display the date picker (from the thread). I also linked it all up in the 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];   }   

However, when I click on the UITextField, I get this:

enter image description here

What am I doing wrong?

like image 719
MrHappyAsthma Avatar asked Jun 25 '12 21:06

MrHappyAsthma


2 Answers

You could use the UITextField input view property. Just alloc init a regular UIDatePicker in code and assign it to the textfield's inputView. Doing this, the UIPickerView will be presented instead of the keyboard. If you need any code feel free to ask :)

EDIT: code

You fist hook up your textField with IB

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

In the implementation

UIDatePicker *datePicker = [[UIDatePicker alloc]init]; [datePicker setDate:[NSDate date]]; [datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged]; if (@available(iOS 13.4, *)) {     [datePicker setPreferredDatePickerStyle:UIDatePickerStyleWheels]; }        [self.myTextField setInputView:datePicker]; 

That will bring up a UIDatePicker when you tap on the textField. Note the action that I added to the datePicker.

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

To update the textField each time that the user scrolls in the picker, you just need to implement the updateTextField method somewhere in the viewController

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

With this last method, every time the user rotates the picker, the textfield will update!

  • You could use a NSDateFormatter to improve the output of the string.
like image 56
tomidelucca Avatar answered Sep 21 '22 03:09

tomidelucca


Below is how I am displaying the date picker.

- (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; } 
like image 34
JRo Avatar answered Sep 19 '22 03:09

JRo