O que é uma maneira simples de obter uma caixa de diálogo pop-up de entrada de texto em um iPhone

125

Eu quero obter o nome de usuário. Uma caixa de diálogo de entrada de texto simples. Alguma maneira simples de fazer isso?

user605957
fonte
1
espere alguns meses, até cerca de setembro, e sua vida será muito mais fácil.
Jonathan.

Respostas:

264

No iOS 5, há uma maneira nova e fácil de fazer isso. Ainda não tenho certeza se a implementação está totalmente concluída, já que não é agradável como, digamos, a UITableViewCell, mas deve definitivamente fazer o truque, já que agora é suportada por padrão na API do iOS. Você não precisará de uma API privada para isso.

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

Isso renderiza um alerta como este (captura de tela tirada do simulador do iPhone 5.0 no XCode 4.2):

exemplo de alerta com alertViewStyle definido como UIAlertViewStylePlainTextInput

Ao pressionar qualquer botão, os métodos regulares de delegação serão chamados e você poderá extrair o textInput da seguinte maneira:

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

Aqui eu apenas NSLog os resultados que foram inseridos. No código de produção, você provavelmente deve manter um ponteiro para o alertView como uma variável global ou usar a tag alertView para verificar se a função delegada foi chamada pelo apropriado, UIAlertViewmas para este exemplo, tudo bem.

Você deve verificar a API UIAlertView e verá que existem mais estilos definidos.

Espero que isso tenha ajudado!

- EDITAR -

Eu estava brincando um pouco com o alertView e suponho que ele não precise de nenhum anúncio de que é perfeitamente possível editar o campo de texto conforme desejado: você pode criar uma referência ao UITextFielde editar como normal (programaticamente). Para isso, construí um alertView, como você especificou na sua pergunta original. Antes tarde do que nunca, certo :-)?

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

Isso produz este alerta:

UIAlertView que usa o UIAlertViewPlainTextInput alertStyle para solicitar um nome de usuário

Você pode usar o mesmo método de delegação que eu pôster anteriormente para processar o resultado da entrada. Não tenho certeza se você pode impedir que a UIAlertViewdemissão seja descartada (não há shouldDismissfunção delegada AFAIK), portanto, suponho que, se a entrada do usuário for inválida, você deverá colocar um novo alerta (ou apenas refazer showeste) até que a entrada correta seja inserido.

Diverta-se!

Warkst
fonte
1
Com a contagem automática de referência, não é mais necessário reter e liberar objetos.
Waqleh 25/03
5
Eu sei, mas esta resposta foi escrita em 2011.
Warkst 25/03
3
O método está depreciado desde o IOS 9.0. Em vez disso, use UIAlertController:
EckhardN
Se você está procurando apoio com Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato
186

Para garantir o retorno das chamadas após o usuário digitar o texto, defina o delegado dentro do manipulador de configuração. textField.delegate = self

Swift 3 e 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)

No Swift (iOS 8-10):

insira a descrição da imagem aqui

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

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

PARA iOS 5-7:

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

insira a descrição da imagem aqui


NOTA: Abaixo não funciona com o iOS 7 (iOS 4-6 funciona)

Apenas para adicionar outra versão.

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

}

depois ligo [alert show];quando quero.

O método que acompanha

- (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
fonte
1
Eu tinha algo assim desde o IOS 4, mas parece ter quebrado o OS 7. Agora, use o código do Wakrst - salve muitas linhas de código.
Dave Appleton
Então, qual seria a maneira correta de fazer isso no iOS7? Estamos construindo com o iOS6 SDK, mas ele ainda mostra estranho no iOS7.
sebrock
Adicionado suporte iOS7 à pergunta
John Riselvato 23/09
1
Descobri que eu tinha que colocar o seguinte no meu alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexmétodo delegado para obter o valor do textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih
1
substitua "var alert" por "let alert" no código swift para estar em conformidade com a versão mais recente do swift
Matei Suica
11

Testei o terceiro trecho de código de Warkst - funcionou muito bem, exceto que eu mudei para o tipo de entrada padrão em vez de numérico:

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
fonte
Bom ponto! Eu estava mexendo com o campo de texto na época e esqueci de alterar o tipo de teclado antes de fazer o upload do trecho de código. Que bom que meu código poderia ajudá-lo!
Warkst 30/04
11

Desde o IOS 9.0, use 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
fonte
5

Só queria acrescentar uma informação importante que, acredito, foi deixada de fora, talvez com a suposição de que quem procura respostas já deve saber. Esse problema ocorre muito e eu também fiquei preso quando tentei implementar o viewAlertmétodo para os botões da UIAlertViewmensagem. Para fazer isso, você precisa primeiro adicionar a classe delegate, que pode ser algo como isto:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Além disso, você pode encontrar um tutorial muito útil aqui !

Espero que isto ajude.

Jason Lambert
fonte
5

Experimente este código Swift em um 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
fonte
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
fonte
2

Eu usaria um UIAlertViewcom uma UITextFieldsubview. Você pode adicionar o campo de texto manualmente ou, no iOS 5, usar um dos novos métodos.

Alexsander Akers
fonte
Eu adicionei o seguinte código a partir de outro post, mas os shows pop-up-se para fora da tela (muito no topo, com apenas a metade inferior visível)
user605957
2
codeUIAlertView * myAlertView = [[alocação de UIAlertView] initWithTitle: @ "Seu título aqui" mensagem: @ "isso é coberto" delegado: self cancelButtonTitle: @ "Cancelar" otherButtonTitles: @ "OK", nada]; UITextField * myTextField = [[alocação de UITextField] 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]; [show myAlertView]; [versão myAlertView];
user605957
Tentei um código semelhante e ele exibe a visualização de alerta com caixa de texto e botões, mas não há espaço suficiente para o campo de texto, ele fica preso entre o título e os botões e toca nos dois. Eu tentei algumas transformações para dimensionar o quadro, mas os botões permanecem onde estavam, então eles precisam ser movidos também. Não sei como reposicionar os botões e não acredito que tudo isso seja necessário para recuperar uma única linha de texto de um prompt para o usuário. Não existe uma maneira melhor do que isso?
Dean Davids
2

Adicione visualizações a um UIAlertView como este . No iOS 5, existem algumas coisas "mágicas" que fazem isso por você (mas isso tudo depende do NDA).

Matt S.
fonte
Eu tentei isso e funciona um pouco. Exceto que o pop-up está fora da tela (a metade superior do pop-up é cortada). Alguma idéia do porquê?
user605957
Eu tive o mesmo problema, removendo o setTranformMakeTranslation (0,109) o corrigiu para mim no ipad e no iphone. Apareceu no lugar certo sem ele.
joeld
2

No Xamarin e 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
fonte
0

Com base na resposta de John Riselvato, para recuperar a string de volta do 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
        })
Raio
fonte
-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
fonte