Was ist eine einfache Möglichkeit, ein Popup-Dialogfeld für die Texteingabe auf einem iPhone aufzurufen?

125

Ich möchte den Benutzernamen erhalten. Ein einfaches Dialogfeld zur Texteingabe. Irgendeine einfache Möglichkeit, dies zu tun?

user605957
quelle
1
Warten Sie einfach ein paar Monate bis etwa September, und Ihr Leben wird viel einfacher.
Jonathan.

Antworten:

264

In iOS 5 gibt es einen neuen und einfachen Weg dazu. Ich bin mir nicht sicher, ob die Implementierung vollständig abgeschlossen ist, da sie nicht UITableViewCellso freundlich ist wie beispielsweise a , aber sie sollte definitiv den Trick machen, da sie jetzt standardmäßig in der iOS-API unterstützt wird. Sie benötigen hierfür keine private API.

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

Dadurch wird eine alertView wie folgt dargestellt (Screenshot aus dem iPhone 5.0-Simulator in XCode 4.2):

Beispielalarm mit alertViewStyle auf UIAlertViewStylePlainTextInput

Wenn Sie eine beliebige Taste drücken, werden die regulären Delegate-Methoden aufgerufen und Sie können den textInput dort wie folgt extrahieren:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}

Hier habe ich nur die eingegebenen Ergebnisse NSLog. Im Produktionscode sollten Sie wahrscheinlich einen Zeiger auf Ihre alertView als globale Variable behalten oder das alertView-Tag verwenden, um zu überprüfen, ob die Delegatenfunktion von der entsprechenden Person aufgerufen wurde. In UIAlertViewdiesem Beispiel sollte dies jedoch in Ordnung sein.

Sie sollten die UIAlertView-API überprüfen und feststellen, dass weitere Stile definiert sind.

Hoffe das hat geholfen!

- BEARBEITEN -

Ich habe ein wenig mit dem alertView herumgespielt und ich nehme an, es bedarf keiner Ankündigung, dass es durchaus möglich ist, das textField wie gewünscht zu bearbeiten: Sie können einen Verweis auf das erstellen UITextFieldund es wie gewohnt (programmgesteuert) bearbeiten. Dabei habe ich eine alertView erstellt, wie Sie in Ihrer ursprünglichen Frage angegeben haben. Besser spät als nie, oder :-)?

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

Dies erzeugt diese Warnung:

UIAlertView, das den UIAlertViewPlainTextInput alertStyle verwendet, um nach einem Benutzernamen zu fragen

Sie können dieselbe Delegate-Methode wie im vorherigen Poster verwenden, um das Ergebnis aus der Eingabe zu verarbeiten. Ich bin mir nicht sicher, ob Sie verhindern können, dass der Benutzer UIAlertViewentlassen wird (es gibt keine shouldDismissDelegierungsfunktion AFAIK). Wenn also die Benutzereingabe ungültig ist, müssen Sie eine neue Warnung (oder nur showdiese) eingeben, bis die richtige Eingabe erfolgt ist trat ein.

Habe Spaß!

Warkst
quelle
1
Mit der automatischen Referenzzählung sollten Sie Objekte nicht mehr selbst behalten und freigeben.
Waqleh
5
Ich weiß, aber diese Antwort wurde im Jahr 2011 geschrieben.
Warkst
3
Die Methode wird seit IOS 9.0 abgeschrieben. Verwenden Sie stattdessen UIAlertController:
EckhardN
Wenn Sie Unterstützung mit Swift 4 suchen: stackoverflow.com/a/10689318/525576
John Riselvato
186

Um sicherzustellen, dass Sie die Rückrufe erhalten, nachdem der Benutzer Text eingegeben hat, legen Sie den Delegaten im Konfigurationshandler fest. 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)

In Swift (iOS 8-10):

Geben Sie hier die Bildbeschreibung ein

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

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

FÜR iOS 5-7:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

Geben Sie hier die Bildbeschreibung ein


HINWEIS: Unten funktioniert nicht mit iOS 7 (iOS 4 - 6 funktioniert)

Nur um eine weitere Version hinzuzufügen.

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

}

dann rufe ich an, [alert show];wenn ich es will.

Die Methode, die mitgeht

- (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
quelle
1
Ich hatte so etwas seit IOS 4, aber es scheint in OS 7 zu brechen. Verwenden Sie jetzt Wakrsts Code - speichern Sie viele Codezeilen.
Dave Appleton
Was wäre der richtige Weg, dies für iOS7 zu tun? Wir bauen mit iOS6 SDK, aber es zeigt sich immer noch komisch auf iOS7.
sebrock
IOS7 Unterstützung zur Frage
hinzugefügt
1
Es wurde festgestellt, dass ich Folgendes in meine alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexDelegatmethode einfügen musste, um den Wert von textField.text abzurufen: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih
1
Ersetzen Sie "var alert" durch "let alert" im Swift-Code, um der neuesten Version von Swift
Matei Suica
11

Das dritte Code-Snippet von Warkst getestet - hat hervorragend funktioniert, außer dass ich es als Standardeingabetyp anstelle von numerisch geändert habe:

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
quelle
Guter Punkt! Ich habe damals mit textField rumgespielt und vergessen, den Tastaturtyp zu ändern, bevor ich das Code-Snippet hochgeladen habe. Ich bin froh, dass mein Code Ihnen helfen konnte!
Warkst
11

Verwenden Sie seit IOS 9.0 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
quelle
5

Ich wollte nur eine wichtige Information hinzufügen, von der ich glaube, dass sie weggelassen wurde, vielleicht mit der Annahme, dass diejenigen, die nach Antworten suchen, es vielleicht bereits wissen. Dieses Problem tritt häufig auf und auch ich steckte fest, als ich versuchte, die viewAlertMethode für die Schaltflächen der UIAlertViewNachricht zu implementieren . Dazu müssen Sie zuerst die Delegatenklasse hinzufügen, die ungefähr so ​​aussieht:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Sie können auch ein sehr hilfreich Tutorial hier !

Hoffe das hilft.

Jason Lambert
quelle
5

Versuchen Sie diesen Swift-Code in einem 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
quelle
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
quelle
2

Ich würde ein UIAlertViewmit einer UITextFieldUnteransicht verwenden. Sie können das Textfeld entweder manuell hinzufügen oder in iOS 5 eine der neuen Methoden verwenden.

Alexsander Akers
quelle
Ich habe den folgenden Code aus einem anderen Beitrag hinzugefügt, aber das Popup wird auf dem Bildschirm angezeigt (ganz oben, nur die untere Hälfte ist sichtbar)
user605957
2
codeUIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle: @ Nachricht "Ihr Titel hier": @ "dies wird behandelt" delegate: self cancelButtonTitle: @ "Cancel" otherButtonTitles: @ "OK", nil]; UITextField * myTextField = [[UITextField-Zuweisung] 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]; [myAlertView-Version];
user605957
Ich habe einen ähnlichen Code ausprobiert und er zeigt die Warnansicht mit Textfeld und Schaltflächen an, aber es ist nicht genügend Platz für das Textfeld vorhanden. Er steckt zwischen dem Titel und den Schaltflächen und berührt beide. Ich habe einige Transformationen versucht, um den Rahmen zu skalieren, aber die Schaltflächen bleiben dort, wo sie waren, sodass sie auch verschoben werden müssen. Ich weiß nicht, wie ich die Schaltflächen neu positionieren soll, und ich kann nicht glauben, dass all dies notwendig ist, um eine einzelne Textzeile von einer Eingabeaufforderung an den Benutzer abzurufen. Gibt es keinen besseren Weg als diesen?
Dean Davids
2

In Blick auf eine UIAlertView wie diese . In iOS 5 gibt es einige "magische" Dinge, die dies für Sie tun (aber das ist alles unter NDA).

Matt S.
quelle
Ich habe es versucht und es funktioniert etwas. Außer das Popup ist nicht auf dem Bildschirm (die obere Hälfte des Popups ist abgeschnitten). Irgendwelche Ideen warum?
user605957
Ich hatte das gleiche Problem: Durch Entfernen der setTranformMakeTranslation (0,109) wurde das Problem sowohl auf dem iPad als auch auf dem iPhone behoben. Es zeigte sich an der richtigen Stelle ohne es.
Joeld
2

In Xamarin und 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
quelle
0

Aufbauend auf John Riselvatos Antwort, um den String aus dem UIAlertView zurückzurufen ...

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
        })
Strahl
quelle
-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
quelle