Jaki jest prosty sposób na wyświetlenie wyskakującego okna dialogowego wprowadzania tekstu na telefonie iPhone

125

Chcę uzyskać nazwę użytkownika. Proste okno dialogowe wprowadzania tekstu. Jakiś prosty sposób na zrobienie tego?

user605957
źródło
1
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):

Przykładowy alert z alertViewStyle ustawionym na UIAlertViewStylePlainTextInput

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

UIAlertView, który używa UIAlertViewPlainTextInput alertStyle do pytania o nazwę użytkownika

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.

Baw się dobrze!

Warkst
źródło
1
Dzięki automatycznemu zliczaniu referencji nie powinieneś już samodzielnie zatrzymywać i zwalniać obiektów.
Waqleh
5
Wiem, ale ta odpowiedź została napisana w 2011 roku.
Warkst
3
Metoda jest amortyzowana od wersji IOS 9.0. Zamiast tego użyj UIAlertController:
EckhardN
Jeśli szukasz wsparcia ze Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato Stycznia
186

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj


UWAGA: poniżej nie działa z iOS 7 (iOS 4-6 działa)

Wystarczy dodać kolejną wersję.

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

}

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

    }
}

John Riselvato
źródło
1
Miałem coś takiego od czasu IOS 4, ale wydaje się, że psuje się w OS 7 Teraz użyj kodu Wakrst - zapisz wiele linii kodu.
Dave Appleton
Więc jaki byłby właściwy sposób zrobienia tego w iOS7? Tworzymy z pakietem SDK na iOS6, ale na iOS7 wygląda to dziwnie.
sebrock
Dodano obsługę iOS7 do pytania
John Riselvato,
1
Znaleziono, że alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexw celu pobrania wartości textField.text musiałem umieścić następującą treść: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih
1
zamień „var alert” na „let alert” w kodzie swift, aby zachować zgodność z najnowszą wersją swift
Matei Suica
11

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];
funroll
źródło
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];
EckhardN
źródło
5

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:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Ponadto można znaleźć bardzo pomocny samouczek tutaj !

Mam nadzieję że to pomoże.

Jason Lambert
źródło
5

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;
}
J-Dizzle
źródło
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
źródło
2

Chciałbym używać UIAlertViewz UITextFieldpodrzędny. Możesz dodać pole tekstowe ręcznie lub, w iOS 5, użyć jednej z nowych metod.

Alexsander Akers
źródło
Dodałem następujący kod z innego postu, ale wyskakujące okienko pojawia się poza ekranem (bardzo na górze, z widoczną tylko dolną połową)
user605957
2
codeUIAlertView * 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];
user605957
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).

Matt S.
źródło
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 = 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
źródło
0

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
        })
Promień
źródło
-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
źródło