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:
Qu'est-ce que je fais mal?
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!
NSDateFormatter
pour améliorer la sortie de la chaîne. 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;
}
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)
}
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.
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)
}
}