web-dev-qa-db-fra.com

Afficher le datepicker en tapant sur le champ de texte

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.

24
appuser

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.

42

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;
11
oscar castellon

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

3
iAnkit

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.

1
chug2k

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)


}
0
Maulik Patel