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 ?
Avec le comptage automatique des références, vous n'êtes plus censé retenir et libérer les objets vous-même.
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 ?
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) :
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 :
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 !
Avec le comptage automatique des références, vous n'êtes plus censé retenir et libérer les objets vous-même.
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) :
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];
REMARQUE : le tableau ci-dessous ne fonctionne pas avec iOS 7 (iOS 4 - 6 fonctionne).
Juste pour ajouter une autre version.
- (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) {
...
}
}
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.
Alors, quelle serait la bonne façon de procéder pour iOS7 ? Nous construisons avec le SDK iOS6 mais cela reste bizarre sous iOS7.
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];
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.
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)
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] ;
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 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.
1 votes
Attendez quelques mois, jusqu'en septembre, et votre vie sera un lot plus facile.