poczekaj kilka miesięcy, do około września, a życie będzie o wiele łatwiejsze.
Jonathan.
Odpowiedzi:
264
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:
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, UIAlertViewale w tym przykładzie powinno to być w porządku.
Bawiłem się trochę alertView i przypuszczam, że nie ma potrzeby ogłaszania, że można dowolnie edytować textField: możesz utworzyć odniesienie do UITextFieldi 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 UIAlertViewodrzuceniu (nie ma shouldDismissfunkcji delegata AFAIK), więc przypuszczam, że jeśli dane wejściowe użytkownika są nieprawidłowe, musisz ustawić nowy alert (lub po prostu ponownie showten), aż poprawne dane wejściowe zostaną weszła.
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)
-(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){...}}
Słuszna uwaga! Bawiłem się wtedy w textField i zapomniałem zmienić typ klawiatury przed przesłaniem fragmentu kodu. Cieszę się, że mój kod może Ci pomóc!
Warkst
11
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ć viewAlertmetodę dla przycisków UIAlertViewkomunikatu. Aby to zrobić, musisz najpierw dodać klasę delegata, która może wyglądać mniej więcej tak:
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)->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;}
Wypróbowałem podobny kod i wyświetla widok alertu z polem tekstowym i przyciskami, ale nie ma wystarczająco dużo miejsca na pole tekstowe, utknął między tytułem a przyciskami i dotyka ich obu. Próbowałem niektórych transformacji, aby przeskalować ramkę, ale przyciski pozostają na swoim miejscu, więc trzeba je również przesunąć. Nie wiem, jak zmienić położenie przycisków i nie mogę uwierzyć, że wszystko to jest konieczne, aby pobrać pojedynczy wiersz tekstu z zachęty do użytkownika. Czy nie ma lepszego sposobu niż ten?
Dean Davids
2
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).
Próbowałem tego i trochę działa. Z wyjątkiem wyskakującego okienka poza ekranem (górna połowa wyskakującego okienka jest odcięta). Jakieś pomysły, dlaczego?
user605957
Miałem ten sam problem, usuwając setTranformMakeTranslation (0,109) naprawiłem go zarówno na iPadzie, jak i iPhonie. Bez niego pojawił się we właściwym miejscu.
dołączono
2
W Xamarin i 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();
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})
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.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:
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 :-)?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 mashouldDismiss
funkcji delegata AFAIK), więc przypuszczam, że jeśli dane wejściowe użytkownika są nieprawidłowe, musisz ustawić nowy alert (lub po prostu ponownieshow
ten), aż poprawne dane wejściowe zostaną weszła.Baw się dobrze!
źródło
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):
W Swift (iOS 8-10):
W Objective-C (iOS 8):
DLA iOS 5-7:
UWAGA: poniżej nie działa z iOS 7 (iOS 4-6 działa)
Wystarczy dodać kolejną wersję.
wtedy dzwonię,
[alert show];
kiedy tego chcę.Metoda, która się sprawdza
źródło
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:
źródło
Od IOS 9.0 używaj UIAlertController:
źródło
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ówUIAlertView
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.
źródło
Wypróbuj ten kod Swift w kontrolerze UIViewController -
źródło
Swift 3:
źródło
Chciałbym używać
UIAlertView
zUITextField
podrzędny. Możesz dodać pole tekstowe ręcznie lub, w iOS 5, użyć jednej z nowych metod.źródło
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).
źródło
W Xamarin i C #:
źródło
Opierając się na odpowiedzi Johna Riselvato, aby pobrać ciąg z powrotem z UIAlertView ...
źródło
źródło