web-dev-qa-db-fra.com

Qu'est-ce qu'un moyen simple d'obtenir une boîte de dialogue contextuelle de saisie de texte sur un iPhone?

Je veux obtenir le nom d'utilisateur. Une simple boîte de dialogue de saisie de texte. Un moyen simple de faire cela?

122
user605957

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):

example alert with alertViewStyle set to UIAlertViewStylePlainTextInput

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:

UIAlertView that uses the UIAlertViewPlainTextInput alertStyle to ask a user name

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!

264
Warkst

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):

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: ci-dessous ne fonctionne pas avec iOS 7 (iOS 4 - 6 Works)

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 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) {
        ...

    }
}

181
John Riselvato

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];
11
funroll

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];
9
EckhardN

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;
}
5
J-Dizzle

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.

5
Jason Lambert

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)
3
Daniil Chuiko

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();
2
Bjørn Egil

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.

2
Alexsander Akers

Ajouter des vues à un UIAlertView comme this . Dans iOS 5, certaines choses "magiques" le font pour vous (mais tout cela est sous NDA).

2
Matt S.

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
        })
0
Ray