web-dev-qa-db-fra.com

sélecteur de date d'affichage iPhone sur UITextField touch

J'ai suivi ce sujet: datepicker en cliquant sur textfield

J'ai importé les deux protocoles suivants:

@interface ViewController : UIViewController<UIActionSheetDelegate, UITextFieldDelegate> {

Ensuite, dans l'implémentation, j'utilise les éléments suivants:

- (void)viewDidLoad {

    textField.delegate = self;

[super viewDidLoad] }

Enfin, je mets le code actuel pour afficher le sélecteur de date (à partir du fil de discussion). J'ai également relié le tout à l'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];  
}  

Cependant, lorsque je clique sur UITextField, je reçois ceci:

enter image description here

Qu'est-ce que je fais mal?

22
MrHappyAsthma

Vous pouvez utiliser la propriété de vue d'entrée UITextField. Il suffit d'allouer à init une UIDatePicker régulière dans le code et de l'assigner à inputView du champ de texte. En faisant cela, la UIPickerView sera présentée à la place du clavier. Si vous avez besoin de code, n'hésitez pas à demander :)

EDIT: code

Vous branchez votre textField avec IB

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

Dans la mise en œuvre 

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

Cela affichera une UIDatePicker lorsque vous appuyez sur la textField. Notez l'action que j'ai ajoutée à datePicker.

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

Pour mettre à jour le champ textField chaque fois que l'utilisateur fait défiler le sélecteur, il vous suffit d'implémenter la méthode updateTextField quelque part dans la variable viewController.

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

Avec cette dernière méthode, chaque fois que l'utilisateur fait pivoter le sélecteur, le champ de texte est mis à jour!

  • Vous pouvez utiliser NSDateFormatter pour améliorer la sortie de la chaîne. 
63
tomidelucca

Voici comment j'affiche le sélecteur de date.

- (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;
}
12
JRo

La solution @JRo fonctionne très bien!

Voici mon code mis à jour dans 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)
}
3
Natalia Terlecka

Veuillez passer par ce processusIn .h créer un objet pour UIDatePicker

UIDatePicker *datePicker;

dans le fichier .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];

après cela, vous pouvez créer 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]) {
   }
}

Cela fonctionne pour moi.

0
User558

Une approche intéressante consiste à créer votre propre classe (je l’ai appelée TextFieldFormDate), qui est dérivée de UITextField et qui encapsule tous les comportements requis. Dans votre storyboard, définissez ensuite la classe du champ de texte sur TextFieldFormDate (dans mon cas).

Utilisez didChange et didSelect dans votre ViewController (qui utilise la variable TextFieldFormDate) pour être averti des modifications et de la date de sélection de la date.

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)
    }

}
0
HixField