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):
Wenn Sie eine beliebige Taste drücken, werden die regulären Delegate-Methoden aufgerufen und Sie können den textInput dort wie folgt extrahieren:
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.
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:
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.
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)
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {NSString* detailString = textField.text;NSLog(@"String is: %@", detailString);//Put it on the debuggerif([textField.text length]<=0|| buttonIndex ==0){return;//If cancel or 0 length string the string doesn't matter}if(buttonIndex ==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];
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];
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:
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)->Voidin// 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)->Voidinprint("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;}
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.
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)
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).
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 =newUIAlertView("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();
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})
Antworten:
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
UITableViewCell
so 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.Dadurch wird eine alertView wie folgt dargestellt (Screenshot aus dem iPhone 5.0-Simulator in XCode 4.2):
Wenn Sie eine beliebige Taste drücken, werden die regulären Delegate-Methoden aufgerufen und Sie können den textInput dort wie folgt extrahieren:
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
UIAlertView
diesem 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
UITextField
und 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 :-)?Dies erzeugt diese Warnung:
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
UIAlertView
entlassen wird (es gibt keineshouldDismiss
Delegierungsfunktion AFAIK). Wenn also die Benutzereingabe ungültig ist, müssen Sie eine neue Warnung (oder nurshow
diese) eingeben, bis die richtige Eingabe erfolgt ist trat ein.Habe Spaß!
quelle
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):
In Swift (iOS 8-10):
In Objective-C (iOS 8):
FÜR iOS 5-7:
HINWEIS: Unten funktioniert nicht mit iOS 7 (iOS 4 - 6 funktioniert)
Nur um eine weitere Version hinzuzufügen.
dann rufe ich an,
[alert show];
wenn ich es will.Die Methode, die mitgeht
quelle
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
Delegatmethode einfügen musste, um den Wert von textField.text abzurufen: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`Das dritte Code-Snippet von Warkst getestet - hat hervorragend funktioniert, außer dass ich es als Standardeingabetyp anstelle von numerisch geändert habe:
quelle
Verwenden Sie seit IOS 9.0 UIAlertController:
quelle
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
viewAlert
Methode für die Schaltflächen derUIAlertView
Nachricht 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.
quelle
Versuchen Sie diesen Swift-Code in einem UIViewController -
quelle
Swift 3:
quelle
Ich würde ein
UIAlertView
mit einerUITextField
Unteransicht verwenden. Sie können das Textfeld entweder manuell hinzufügen oder in iOS 5 eine der neuen Methoden verwenden.quelle
code
UIAlertView * 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];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).
quelle
In Xamarin und C #:
quelle
Aufbauend auf John Riselvatos Antwort, um den String aus dem UIAlertView zurückzurufen ...
quelle
quelle