Chcę uzyskać nazwę użytkownika. Proste okno dialogowe wprowadzania tekstu. Jakiś prosty sposób na zrobienie tego?
Chcę uzyskać nazwę użytkownika. Proste okno dialogowe wprowadzania tekstu. Jakiś prosty sposób na zrobienie tego?
Odpowiedzi:
W iOS 5 jest na to nowy i łatwy sposób. Nie jestem pewien, czy implementacja jest jeszcze w pełni ukończona, ponieważ nie jest łaskawa, jak powiedzmy a UITableViewCell
, ale zdecydowanie powinna załatwić sprawę, ponieważ jest teraz standardowo obsługiwana w API iOS. Nie będziesz do tego potrzebować prywatnego interfejsu 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];
To renderuje alertView w następujący sposób (zrzut ekranu z symulatora iPhone'a 5.0 w XCode 4.2):
Po naciśnięciu dowolnego przycisku zostaną wywołane zwykłe metody delegata i możesz tam wyodrębnić tekstInput w następujący sposób:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}
Tutaj po prostu NSLoguj wprowadzone wyniki. W kodzie produkcyjnym prawdopodobnie powinieneś zachować wskaźnik do swojego alertView jako zmienną globalną lub użyć tagu alertView, aby sprawdzić, czy funkcja delegata została wywołana przez odpowiedni, UIAlertView
ale w tym przykładzie powinno to być w porządku.
Powinieneś sprawdzić interfejs API UIAlertView, a zobaczysz, że zdefiniowano więcej stylów.
Mam nadzieję, że to pomogło!
-- EDYTOWAĆ --
Bawiłem się trochę alertView i przypuszczam, że nie ma potrzeby ogłaszania, że można dowolnie edytować textField: możesz utworzyć odniesienie do UITextField
i edytować je normalnie (programowo). Robiąc to, skonstruowałem alertView, jak określiłeś w swoim pierwotnym pytaniu. Lepiej późno niż wcale, prawda :-)?
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];
Powoduje to powstanie tego alertu:
Aby przetworzyć wynik z danych wejściowych, możesz użyć tej samej metody delegata, którą opublikowałem wcześniej. Nie jestem pewien, czy możesz zapobiec UIAlertView
odrzuceniu (nie ma shouldDismiss
funkcji delegata AFAIK), więc przypuszczam, że jeśli dane wejściowe użytkownika są nieprawidłowe, musisz ustawić nowy alert (lub po prostu ponownie show
ten), aż poprawne dane wejściowe zostaną weszła.
Baw się dobrze!
Aby upewnić się, że wywołania zwrotne zostaną odebrane po wprowadzeniu tekstu przez użytkownika, ustaw delegata w programie obsługi konfiguracji. textField.delegate = self
Swift 3 i 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)
W 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)
}
W 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];
}
DLA iOS 5-7:
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
UWAGA: poniżej nie działa z iOS 7 (iOS 4-6 działa)
Wystarczy dodać kolejną wersję.
- (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];
}
wtedy dzwonię, [alert show];
kiedy tego chcę.
Metoda, która się sprawdza
- (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) {
...
}
}
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
w celu pobrania wartości textField.text musiałem umieścić następującą treść: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
Przetestowałem trzeci fragment kodu Warksta - działał świetnie, z wyjątkiem tego, że zmieniłem go na domyślny typ wejściowy zamiast liczbowego:
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];
Od IOS 9.0 używaj 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];
Chciałem tylko dodać ważną informację, która moim zdaniem została pominięta przy założeniu, że osoby poszukujące odpowiedzi mogą już wiedzieć. Ten problem zdarza się często i też utknąłem, gdy próbowałem zaimplementować viewAlert
metodę dla przycisków UIAlertView
komunikatu. Aby to zrobić, musisz najpierw dodać klasę delegata, która może wyglądać mniej więcej tak:
@interface YourViewController : UIViewController <UIAlertViewDelegate>
Ponadto można znaleźć bardzo pomocny samouczek tutaj !
Mam nadzieję że to pomoże.
Wypróbuj ten kod Swift w kontrolerze 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;
}
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)
Chciałbym używać UIAlertView
z UITextField
podrzędny. Możesz dodać pole tekstowe ręcznie lub, w iOS 5, użyć jednej z nowych metod.
code
UIAlertView * myAlertView = [[UIAlertView assign] initWithTitle: @ "Tutaj Twój tytuł" message: @ "to jest objęte" delegat: self cancelButtonTitle: @ "Anuluj" otherButtonTitles: @ "OK", nil]; UITextField * myTextField = [[UITextField assign] 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]; [pokaz myAlertView]; [wersja myAlertView];
Dodaj widoki do UIAlertView w ten sposób . W iOS 5 jest kilka „magicznych” rzeczy, które robią to za Ciebie (ale to wszystko w ramach NDA).
W Xamarin i 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();
Opierając się na odpowiedzi Johna Riselvato, aby pobrać ciąg z powrotem z 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
})
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];