attendez quelques mois, jusque vers septembre, et votre vie sera beaucoup plus facile.
Jonathan.
Réponses:
264
Dans iOS 5, il existe un moyen nouveau et simple d'y parvenir. Je ne suis pas sûr que l'implémentation soit encore complètement terminée car ce n'est pas un gracieux comme, par exemple, un UITableViewCell, mais cela devrait certainement faire l'affaire car il est maintenant pris en charge en standard dans 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 une alerteView comme celle-ci (capture d'écran prise à partir du simulateur iPhone 5.0 dans XCode 4.2):
Lorsque vous appuyez sur n'importe quel bouton, les méthodes de délégué régulières seront appelées et vous pouvez extraire le textInput comme suit:
Ici, je viens de NSLog les résultats qui ont été saisis. Dans le code de production, vous devriez probablement garder 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 le approprié, UIAlertViewmais pour cet exemple, cela devrait être correct.
Vous devriez vérifier l' API UIAlertView et vous verrez que d'autres styles sont définis.
J'espère que cela a aidé!
-- ÉDITER --
Je jouais un peu avec alertView et je suppose qu'il n'est pas nécessaire d'annoncer qu'il est parfaitement possible d'éditer le textField comme vous le souhaitez: vous pouvez créer une référence au UITextFieldet l'éditer normalement (par programmation). Pour ce faire, j'ai construit un alertView comme vous l'avez spécifié dans votre question d'origine. 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 de délégué que j'ai poster plus tôt pour traiter le résultat de l'entrée. Je ne sais pas si vous pouvez empêcher le UIAlertViewrejet (il n'y a pas de shouldDismissfonction de délégué AFAIK) donc je suppose que si l'entrée utilisateur est invalide, vous devez mettre en place une nouvelle alerte (ou simplement showcelle-ci) jusqu'à ce que l'entrée correcte soit entré.
Pour vous assurer que vous recevez les rappels une fois que l'utilisateur a saisi du texte, définissez le délégué dans le gestionnaire de configuration. textField.delegate = self
Swift 3 et 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)
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {NSString* detailString = textField.text;NSLog(@"String is: %@", detailString);//Put it on the debuggerif([textField.text length]<=0|| buttonIndex ==0){return;//If cancel or 0 length string the string doesn't matter}if(buttonIndex ==1){...}}
J'ai eu quelque chose comme ça depuis IOS 4 mais il semble casser dans OS 7 Maintenant, utilisez le code de Wakrst - enregistrez de nombreuses lignes de code.
Dave Appleton
Alors, quelle serait la bonne façon de faire cela pour iOS7? Nous construisons avec le SDK iOS6, mais cela semble toujours étrange sur iOS7.
sebrock
Ajout du support iOS7 à la question
John Riselvato
1
J'ai trouvé que je devais mettre ce qui suit dans ma alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexméthode de délégué afin de récupérer la valeur du textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih
1
remplacer "var alert" par "let alert" dans le code swift pour se conformer à la dernière version de swift
Matei Suica
11
Testé le troisième extrait de code de Warkst - a très bien fonctionné, sauf que je l'ai changé pour être le type d'entrée par défaut au lieu de 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];
Bon point! J'étais en train de jouer avec le textField à l'époque et j'ai oublié de changer le type de clavier avant de télécharger l'extrait de code. Heureux que mon code puisse vous aider!
Warkst
11
Depuis IOS 9.0, utilisez UIAlertController:
UIAlertController* alert =[UIAlertController alertControllerWithTitle:@"My Alert"
message:@"This is an alert."
preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* defaultAction =[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction* action){//use alert.textFields[0].text}];UIAlertAction* cancelAction =[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
handler:^(UIAlertAction* action){//cancel action}];[alert addTextFieldWithConfigurationHandler:^(UITextField*_Nonnull textField){// A block for configuring the text field prior to displaying the alert}];[alert addAction:defaultAction];[alert addAction:cancelAction];[self presentViewController:alert animated:YES completion:nil];
Je voulais simplement ajouter une information importante qui, à mon avis, a peut-être été omise en supposant que ceux qui cherchent des réponses le savent peut-être déjà. Ce problème se produit souvent et je me suis aussi retrouvé coincé lorsque j'ai essayé d'implémenter la viewAlertméthode pour les boutons du UIAlertViewmessage. Pour ce faire, vous devez d'abord ajouter la classe de délégué qui peut ressembler à ceci:
func doAlertControllerDemo(){var inputTextField:UITextField?;let passwordPrompt =UIAlertController(title:"Enter Password", message:"You have selected to enter your passwod.", preferredStyle:UIAlertControllerStyle.Alert);
passwordPrompt.addAction(UIAlertAction(title:"OK", style:UIAlertActionStyle.Default, handler:{(action)->Voidin// Now do whatever you want with inputTextField (remember to unwrap the optional)let entryStr :String=(inputTextField?.text)!;print("BOOM! I received '\(entryStr)'");self.doAlertViewDemo();//do again!}));
passwordPrompt.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.Default, handler:{(action)->Voidinprint("done");}));
passwordPrompt.addTextFieldWithConfigurationHandler({(textField:UITextField!)in
textField.placeholder ="Password"
textField.secureTextEntry =false/* true here for pswd entry */
inputTextField = textField
});self.presentViewController(passwordPrompt, animated:true, completion:nil);return;}
J'utiliserais un UIAlertViewavec une sous- UITextFieldvue. Vous pouvez ajouter le champ de texte manuellement ou, dans iOS 5, utiliser l'une des nouvelles méthodes.
J'ai ajouté le code suivant d'un autre article, mais la fenêtre contextuelle apparaît hors de l'écran (très bien en haut, avec seulement la moitié inférieure visible)
J'ai essayé un code similaire et il affiche la vue d'alerte avec une zone de texte et des 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é quelques transformations pour mettre à l'échelle le cadre mais les boutons restent là où ils étaient, alors ils doivent également être déplacés. Je ne sais pas comment repositionner les boutons et je ne peux pas croire que tout cela soit nécessaire pour récupérer une seule ligne de texte d'une invite à l'utilisateur. N'y a-t-il pas un meilleur moyen que cela?
Dean Davids
2
Ajoutez des vues à un UIAlertView comme ceci . Dans iOS 5, il y a des choses «magiques» qui le font pour vous (mais tout cela est sous NDA).
J'ai essayé cela et cela fonctionne un peu. Sauf que la popup est hors de l'écran (la moitié supérieure de la popup est coupée). Des idées pourquoi?
user605957
J'ai eu le même problème, la suppression de setTranformMakeTranslation (0,109) l'a corrigé pour moi à la fois sur iPad et iPhone. Il est apparu au bon endroit sans lui.
joeld
2
Dans Xamarin et C #:
var alert =newUIAlertView("Your title","Your description",null,"Cancel",new[]{"OK"});
alert.AlertViewStyle=UIAlertViewStyle.PlainTextInput;
alert.Clicked+=(s, b)=>{var title = alert.ButtonTitle(b.ButtonIndex);if(title =="OK"){var text = alert.GetTextField(0).Text;...}};
alert.Show();
S'appuyant sur la réponse de John Riselvato, pour récupérer la chaîne de UIAlertView ...
alert.addAction(UIAlertAction(title:"Submit", style:UIAlertAction.Style.default){(action :UIAlertAction)in
guard let message = alert.textFields?.first?.text else{return}// Text Field Response Handling Here})
Réponses:
Dans iOS 5, il existe un moyen nouveau et simple d'y parvenir. Je ne suis pas sûr que l'implémentation soit encore complètement terminée car ce n'est pas un gracieux comme, par exemple, un
UITableViewCell
, mais cela devrait certainement faire l'affaire car il est maintenant pris en charge en standard dans l'API iOS. Vous n'aurez pas besoin d'une API privée pour cela.Cela rend une alerteView comme celle-ci (capture d'écran prise à partir du simulateur iPhone 5.0 dans XCode 4.2):
Lorsque vous appuyez sur n'importe quel bouton, les méthodes de délégué régulières seront appelées et vous pouvez extraire le textInput comme suit:
Ici, je viens de NSLog les résultats qui ont été saisis. Dans le code de production, vous devriez probablement garder 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 le approprié,
UIAlertView
mais pour cet exemple, cela devrait être correct.Vous devriez vérifier l' API UIAlertView et vous verrez que d'autres styles sont définis.
J'espère que cela a aidé!
-- ÉDITER --
Je jouais un peu avec alertView et je suppose qu'il n'est pas nécessaire d'annoncer qu'il est parfaitement possible d'éditer le textField comme vous le souhaitez: vous pouvez créer une référence au
UITextField
et l'éditer normalement (par programmation). Pour ce faire, j'ai construit un alertView comme vous l'avez spécifié dans votre question d'origine. Mieux vaut tard que jamais, n'est-ce pas :-)?Cela produit cette alerte:
Vous pouvez utiliser la même méthode de délégué que j'ai poster plus tôt pour traiter le résultat de l'entrée. Je ne sais pas si vous pouvez empêcher le
UIAlertView
rejet (il n'y a pas deshouldDismiss
fonction de délégué AFAIK) donc je suppose que si l'entrée utilisateur est invalide, vous devez mettre en place une nouvelle alerte (ou simplementshow
celle-ci) jusqu'à ce que l'entrée correcte soit entré.S'amuser!
la source
Pour vous assurer que vous recevez les rappels une fois que l'utilisateur a saisi du texte, définissez le délégué dans le gestionnaire de configuration.
textField.delegate = self
Swift 3 et 4 (iOS 10-11):
Dans Swift (iOS 8-10):
Dans Objective-C (iOS 8):
POUR iOS 5-7:
REMARQUE: ci-dessous ne fonctionne pas avec iOS 7 (iOS 4-6 fonctionne)
Juste pour ajouter une autre version.
alors j'appelle
[alert show];
quand je le veux.La méthode qui va de pair
la source
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
méthode de délégué afin de récupérer la valeur du textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`Testé le troisième extrait de code de Warkst - a très bien fonctionné, sauf que je l'ai changé pour être le type d'entrée par défaut au lieu de numérique:
la source
Depuis IOS 9.0, utilisez UIAlertController:
la source
Je voulais simplement ajouter une information importante qui, à mon avis, a peut-être été omise en supposant que ceux qui cherchent des réponses le savent peut-être déjà. Ce problème se produit souvent et je me suis aussi retrouvé coincé lorsque j'ai essayé d'implémenter la
viewAlert
méthode pour les boutons duUIAlertView
message. Pour ce faire, vous devez d'abord ajouter la classe de délégué qui peut ressembler à ceci:@interface YourViewController : UIViewController <UIAlertViewDelegate>
Vous pouvez également trouver un tutoriel très utile ici !
J'espère que cela t'aides.
la source
Essayez ce code Swift dans un UIViewController -
la source
Swift 3:
la source
J'utiliserais un
UIAlertView
avec une sous-UITextField
vue. Vous pouvez ajouter le champ de texte manuellement ou, dans iOS 5, utiliser l'une des nouvelles méthodes.la source
code
UIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle: @ "Votre titre ici" message: @ "ceci est couvert" délégué: self cancelButtonTitle: @ "Annuler" 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]; [version myAlertView];Ajoutez des vues à un UIAlertView comme ceci . Dans iOS 5, il y a des choses «magiques» qui le font pour vous (mais tout cela est sous NDA).
la source
Dans Xamarin et C #:
la source
S'appuyant sur la réponse de John Riselvato, pour récupérer la chaîne de UIAlertView ...
la source
la source