Comment puis-je afficher un contrôle datetimepicker au toucher d'un champ de texte?
J'ai une interface utilisateur avec des champs de texte d'arrivée et de départ, et lorsqu'un utilisateur clique sur la zone de texte d'arrivée, il doit afficher un contrôle datetimepicker au lieu d'un clavier et le même avec la zone de texte de départ.
Vous pouvez utiliser les propriétés inputView
et inputAccessoryView
du champ de texte pour cela. Créez le sélecteur de date et réglez-le sur les vues de saisie des deux champs de texte. Créez également une autre vue pour le bouton Done
et la vue accessoire. Vous aurez besoin de ce bouton pour fermer la vue d'entrée.
Le bouton Done
doit être connecté pour fonctionner, ce qui permet essentiellement de faire ceci -
if ( [textField1 isFirstResponder] ) {
[textField1 resignFirstResponder];
} else if ( [textField2 isFirstResponder] ) {
[textField2 resignFirstResponder];
}
Une autre option serait de sous-classer UITextField
et de remplacer inputView
et inputAccessoryView
. C'est la voie à suivre quand il y en a beaucoup.
Exemple
@interface CustomKeyboardAppDelegate : NSObject <UIApplicationDelegate> {
...
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UIToolbar *accessoryView;
@property (nonatomic, retain) IBOutlet UIDatePicker *customInput;
- (IBAction)dateChanged:(id)sender;
- (IBAction)doneEditing:(id)sender;
@end
Dans le fichier XIB, extrayez une UIToolbar
et une UIDatePicker
mais ne l'attachez pas à la vue. Connectez les prises de manière appropriée. dateChanged:
répond aux modifications du sélecteur de date et doneEditing:
est appelé lorsque l'utilisateur clique sur le bouton Done
de la barre d'outils. Connectez-les aussi. Les méthodes sont implémentées comme indiqué ci-dessous.
@implementation CustomKeyboardAppDelegate
@synthesize window=_window;
@synthesize textField = _textField;
@synthesize accessoryView = _accessoryView;
@synthesize customInput = _customInput;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.textField.inputView = self.customInput;
self.textField.inputAccessoryView = self.accessoryView;
...
}
...
- (IBAction)dateChanged:(id)sender {
UIDatePicker *picker = (UIDatePicker *)sender;
self.textField.text = [NSString stringWithFormat:@"%@", picker.date];
}
- (IBAction)doneEditing:(id)sender {
[self.textField resignFirstResponder];
}
@end
Les deux dernières méthodes vont augmenter à mesure que plus de champs de texte dépendent de ce sélecteur.
Très simple, dans ViewController.h
mettez la UITextFieldDelegate
après dans viewDidLoad
.
txtFecha.delegate = self;
datePicker = [[UIDatePicker alloc]init];
[datePicker setDatePickerMode:UIDatePickerModeDate];
self.txtFecha.inputView = datePicker;
Dans viewDidLoad of ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker addTarget:self action:@selector(dateTextField:) forControlEvents:UIControlEventValueChanged];
[txtFieldBranchYear setInputView:datePicker];
}
Ajouter une méthode dans votre ViewController
-(void) dateTextField:(id)sender
{
UIDatePicker *picker = (UIDatePicker*)txtFieldBranchYear.inputView;
[picker setMaximumDate:[NSDate date]];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSDate *eventDate = picker.date;
[dateFormat setDateFormat:@"dd/MM/yyyy"];
NSString *dateString = [dateFormat stringFromDate:eventDate];
txtFieldBranchYear.text = [NSString stringWithFormat:@"%@",dateString];
}
txtFieldBranchYear est un débouché de UITextField
J'ai trouvé un cours vraiment utile - le billet de blog est ici: http://www.pietrorea.com/2012/07/how-to-hide-the-cursor-in-a-uitextfield/ but it utilise essentiellement la vue inputView/inputAccessory. Le kicker est que UILabel, du moins pour ce que je faisais, était exactement ce dont j'avais besoin.
ouvrir le sélecteur de date en cliquant sur textField Swift 3.0 ajouter UITextFieldDelegate et définir le délégué sur ViewDidload () tfDate.delegate = self
//MARK:- TextField Delegate
//MARK:-
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
//MARK:- DatePicker
//MARK:-
func textFieldDidBeginEditing(_ textField: UITextField) {
self.callDatePicker(textField: tfDate)
}
func callDatePicker(textField:UITextField){
let datePickerView : UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.date
textField.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(MyViewController.handleDatePicker), for: .valueChanged)
}
var str:String = ""
var str1:String = ""
var strStartDate:Date!
var strEndDate:Date!
func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
print("Date :: \(dateFormatter.string(from: sender.date))")
tfDate.text = dateFormatter.string(from: sender.date)
}