Je veux obtenir le nom d'utilisateur. Une boîte de dialogue de saisie de texte simple. Un moyen simple de le faire?
Je veux obtenir le nom d'utilisateur. Une boîte de dialogue de saisie de texte simple. Un moyen simple de le faire?
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.
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:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}
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 :-)?
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 UIAlertView
rejet (il n'y a pas de shouldDismiss
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 simplement show
celle-ci) jusqu'à ce que l'entrée correcte soit entré.
S'amuser!
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)
Dans 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)
}
Dans 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: 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) {
...
}
}
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:
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];
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 viewAlert
méthode pour les boutons du UIAlertView
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.
Essayez ce code Swift dans un UIViewController -
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) -> Void in
// 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) -> Void in
print("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;
}
Swift 3:
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:"
})
self.present(alert, animated: true, completion: nil)
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.
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).
Dans Xamarin et C #:
var alert = new UIAlertView ("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
})
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";
UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";
UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];
lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];
[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];
username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;
[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];
[alt show];