Je veux obtenir le nom d'utilisateur. Une simple boîte de dialogue de saisie de texte. Un moyen simple de faire cela?
Dans iOS 5, il existe un nouveau moyen facile d’y parvenir. Je ne suis pas sûr que l'implémentation soit encore complète, car ce n'est pas une gracieuse comme, par exemple, une UITableViewCell
, mais elle devrait certainement faire l'affaire, car elle est désormais prise en charge de manière 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 un alertView comme ceci (capture d'écran prise du simulateur iPhone 5.0 dans XCode 4.2):
Lorsque vous appuyez sur n’importe quel bouton, les méthodes de délégation habituelles sont appelées et vous pouvez y 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é entrés. Dans le code de production, vous devez probablement conserver un pointeur sur votre alertView en tant que variable globale ou utiliser la balise alertView pour vérifier si la fonction de délégué a été appelée par le UIAlertView
approprié, mais cela devrait suffire.
Vous devriez vérifier le IAlertView API et vous verrez qu'il y a quelques autres styles définis.
J'espère que cela a aidé!
-- MODIFIER --
Je jouais un peu avec alertView et je suppose qu'il n'est pas besoin d'annoncer qu'il est parfaitement possible de modifier textField comme vous le souhaitez: vous pouvez créer une référence à UITextField
et la modifier normalement (par programmation). En faisant cela, j'ai construit un 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 de délégation que celle que j'ai affichée précédemment pour traiter le résultat de l'entrée. Je ne sais pas si vous pouvez empêcher la UIAlertView
de la rejeter (il n'y a pas de fonction de délégué shouldDismiss
AAPI). Je suppose donc que si l'entrée utilisateur est invalide, vous devez créer une nouvelle alerte ( ou simplement reshow
celle-ci) jusqu'à ce que la saisie soit correcte.
S'amuser!
Pour vous assurer de recevoir les rappels après la saisie de 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)
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)
}
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: ci-dessous ne fonctionne pas avec iOS 7 (iOS 4 - 6 Works)
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 avec
- (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) {
...
}
}
Testé le troisième fragment de code de Warkst - a bien fonctionné, sauf que j'ai changé pour qu'il s'agisse d'un type d'entrée par défaut plutôt que 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];
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;
}
Je voulais juste ajouter une information importante qui, je crois, a été laissée de côté, en supposant peut-être que ceux qui cherchent des réponses sont déjà au courant. Ce problème se produit souvent et moi aussi je me suis retrouvé coincé lorsque j'ai essayé d'implémenter la méthode viewAlert
pour les boutons du message UIAlertView
. Pour ce faire, vous devez d'abord ajouter la classe delegate qui peut ressembler à ceci:
@interface YourViewController : UIViewController <UIAlertViewDelegate>
Aussi, vous pouvez trouver un tutoriel très utile ici !
J'espère que cela t'aides.
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)
En 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();
J'utiliserais un UIAlertView
avec une sous-vue UITextField
. Vous pouvez ajouter le champ de texte manuellement ou, dans iOS 5, utiliser l'une des nouvelles méthodes.
Ajouter des vues à un UIAlertView comme this . Dans iOS 5, certaines choses "magiques" le font pour vous (mais tout cela est sous NDA).
S'appuyant sur la réponse de John Riselvato, pour récupérer la chaîne de retour 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
})