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

125

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

user605957
la source
1
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):

exemple d'alerte avec alertViewStyle défini sur UIAlertViewStylePlainTextInput

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é, 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:

UIAlertView qui utilise le UIAlertViewPlainTextInput alertStyle pour demander un nom d'utilisateur

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é.

S'amuser!

Warkst
la source
1
Avec le comptage automatique des références, vous n'êtes plus censé conserver et libérer les objets vous-même.
Waqleh
5
Je sais, mais cette réponse a été écrite en 2011.
Warkst
3
La méthode est dépréciée depuis IOS 9.0. Utilisez à la place UIAlertController:
EckhardN
Si vous recherchez du support avec Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato
186

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

entrez la description de l'image ici

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

entrez la description de l'image ici


REMARQUE: ci-dessous ne fonctionne pas avec iOS 7 (iOS 4-6 fonctionne)

Juste pour ajouter une autre version.

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

    }
}

John Riselvato
la source
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];
funroll
la source
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];
EckhardN
la source
5

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:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Vous pouvez également trouver un tutoriel très utile ici !

J'espère que cela t'aides.

Jason Lambert
la source
5

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;
}
J-Dizzle
la source
3

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)
Daniil Chuiko
la source
2

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.

Alexsander Akers
la source
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)
user605957
2
codeUIAlertView * 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];
user605957
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).

Matt S.
la source
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 = 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();
Bjørn Egil
la source
0

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
        })
Rayon
la source
-1
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];
Bhavin
la source