132 votes

Quel est le moyen le plus simple d'obtenir une boîte de dialogue contextuelle de saisie de texte sur un iPhone ?

Je veux obtenir le nom de l'utilisateur. Une simple boîte de dialogue de saisie de texte. Y a-t-il un moyen simple de le faire ?

1 votes

Attendez quelques mois, jusqu'en septembre, et votre vie sera un lot plus facile.

265voto

Warkst Points 2842

Dans iOS 5, il y a une nouvelle et facile à cela. Je ne suis pas sûr que l'implémentation soit encore complète, car elle n'est pas aussi gracieuse que, disons, une UITableViewCell mais elle devrait faire l'affaire, car elle est désormais prise en charge par l'API iOS. Vous n'aurez pas besoin d'une API privée pour cela.

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];

Cela rend un alertView comme ceci (capture d'écran prise du simulateur iPhone 5.0 dans XCode 4.2) :

example alert with alertViewStyle set to UIAlertViewStylePlainTextInput

Lorsque vous appuyez sur un bouton, les méthodes habituelles du délégué sont appelées et vous pouvez extraire le textInput comme suit :

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}

Ici, je me contente de NSLog les résultats qui ont été saisis. Dans le code de production, vous devriez probablement conserver un pointeur vers votre alertView en tant que variable globale ou utiliser la balise alertView pour vérifier si la fonction déléguée a été appelée par la fonction appropriée. UIAlertView mais pour cet exemple, cela devrait être correct.

Vous devriez consulter le API UIAlertView et vous verrez qu'il y a d'autres styles définis.

J'espère que cela vous a aidé !

-- EDIT --

J'ai joué un peu avec l'alertView et je suppose qu'il n'est pas nécessaire d'annoncer qu'il est parfaitement possible d'éditer le textField comme on le souhaite : on peut créer une référence à la balise UITextField et l'éditer normalement (par programme). En faisant cela, j'ai construit une alertView comme vous l'avez spécifié dans votre question initiale. Mieux vaut tard que jamais, n'est-ce pas :-) ?

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeNumberPad;
alertTextField.placeholder = @"Enter your name";
[alert show];
[alert release];

Cela produit cette alerte :

UIAlertView that uses the UIAlertViewPlainTextInput alertStyle to ask a user name

Vous pouvez utiliser la même méthode déléguée que celle que j'ai affichée précédemment pour traiter le résultat de l'entrée. Je ne suis pas sûr que vous puissiez empêcher l'utilisation de l'option UIAlertView d'écarter cependant (il n'y a pas de shouldDismiss Je suppose donc que si l'entrée de l'utilisateur n'est pas valide, il faut afficher une nouvelle alerte (ou simplement réafficher l'alerte). show celui-ci) jusqu'à ce qu'une entrée correcte soit saisie.

Amusez-vous bien !

1 votes

Avec le comptage automatique des références, vous n'êtes plus censé retenir et libérer les objets vous-même.

5 votes

Je sais, mais cette réponse a été écrite en 2011.

3 votes

Cette méthode est dépréciée depuis IOS 9.0. Utilisez plutôt UIAlertController :

192voto

John Riselvato Points 5217

Pour être sûr de recevoir les rappels après la saisie du texte par l'utilisateur, définissez le délégué dans le gestionnaire de configuration. textField.delegate = self

Swift 3 & 4 (iOS 10 - 11) :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
    textField.placeholder = "Enter text:"
    textField.isSecureTextEntry = true // for password input
})
self.present(alert, animated: true, completion: nil)

En Swift (iOS 8-10) :

enter image description here

override func viewDidAppear(animated: Bool) {
    var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Enter text:"
        textField.secureTextEntry = true
        })
    self.presentViewController(alert, animated: true, completion: nil)
}

En Objective-C (iOS 8) :

- (void) viewDidLoad 
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"Enter text:";
        textField.secureTextEntry = YES;
    }];
    [self presentViewController:alert animated:YES completion:nil];
}

POUR iOS 5-7 :

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

enter image description here


REMARQUE : le tableau ci-dessous ne fonctionne pas avec iOS 7 (iOS 4 - 6 fonctionne).

Juste pour ajouter une autre version.

UIAlert With UITextField

- (void)viewDidLoad{

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    UITextField *textField = [[UITextField alloc] init];
    [textField setBackgroundColor:[UIColor whiteColor]];
    textField.delegate = self;
    textField.borderStyle = UITextBorderStyleLine;
    textField.frame = CGRectMake(15, 75, 255, 30);
    textField.placeholder = @"Preset Name";
    textField.keyboardAppearance = UIKeyboardAppearanceAlert;
    [textField becomeFirstResponder];
    [alert addSubview:textField];

}

alors j'appelle [alert show]; quand je le veux.

La méthode qui va de pair

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         
    NSString* detailString = textField.text;
    NSLog(@"String is: %@", detailString); //Put it on the debugger
    if ([textField.text length] <= 0 || buttonIndex == 0){ 
        return; //If cancel or 0 length string the string doesn't matter
    }
    if (buttonIndex == 1) {
        ...

    }
}

1 votes

J'avais quelque chose comme ça depuis IOS 4 mais il semble que cela soit cassé dans OS 7. Utilisez maintenant le code de Wakrst - économisez de nombreuses lignes de code.

0 votes

Alors, quelle serait la bonne façon de procéder pour iOS7 ? Nous construisons avec le SDK iOS6 mais cela reste bizarre sous iOS7.

0 votes

Ajout du support iOS7 à la question

12voto

funroll Points 4014

J'ai testé le troisième extrait de code de Warkst - ça a bien marché, sauf que j'ai changé le type d'entrée par défaut pour qu'il soit numérique :

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeDefault;
alertTextField.placeholder = @"Enter your name";
[alert show];

0 votes

Bon point ! Je m'amusais avec le textField à ce moment-là et j'ai oublié de changer le type de clavier avant de télécharger le bout de code. Content que mon code puisse vous aider !

5voto

Jason Lambert Points 51

Je voulais juste ajouter un élément d'information important qui, à mon avis, a été laissé de côté, peut-être en supposant que ceux qui cherchent des réponses le savent déjà. Ce problème se produit souvent et je me suis moi aussi retrouvé bloqué lorsque j'ai essayé de mettre en œuvre le programme viewAlert pour les boutons du UIAlertView message. Pour ce faire, vous devez d'abord ajouter la classe de délégué qui peut ressembler à quelque chose comme ceci :

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Vous pouvez également trouver un tutoriel très utile aquí !

J'espère que cela vous aidera.

2voto

Alexsander Akers Points 9635

J'utiliserais un UIAlertView avec un UITextField sous-vision. Vous pouvez ajouter le champ de texte manuellement ou, dans iOS 5, utiliser l'une des nouvelles méthodes.

0 votes

J'ai ajouté le code suivant, tiré d'un autre article, mais la fenêtre contextuelle s'affiche en dehors de l'écran (très en haut, avec seulement la moitié inférieure visible)

2 votes

code UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@ "Your title here" message:@ "this gets covered" delegate:self cancelButtonTitle:@ "Cancel" otherButtonTitles:@ "OK", nil] ; UITextField *myTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45. 0, 260.0, 25.0)] ; CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0.0, 130.0) ; [myAlertView setTransform:myTransform] ; [myTextField setBackgroundColor :[UIColor whiteColor]] ; [myAlertView addSubview:myTextField] ; [myAlertView show] ; [myAlertView release] ;

0 votes

J'ai essayé un code similaire et il affiche la vue d'alerte avec le champ de texte et les boutons mais il n'y a pas assez de place pour le champ de texte, il est coincé entre le titre et les boutons et les touche tous les deux. J'ai essayé d'effectuer des transformations pour mettre le cadre à l'échelle, mais les boutons restent à leur place et doivent donc être déplacés eux aussi. Je ne sais pas comment repositionner les boutons et je n'arrive pas à croire que tout cela soit nécessaire pour récupérer une seule ligne de texte à partir d'une invite pour l'utilisateur. N'y a-t-il pas une meilleure solution ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X