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):
Ao pressionar qualquer botão, os métodos regulares de delegação serão chamados e você poderá extrair o textInput da seguinte maneira:
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:
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.
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)
-(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){...}}
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];
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];
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:
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)->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;}
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).
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})
Respostas:
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.Isso renderiza um alerta como este (captura de tela tirada do simulador do iPhone 5.0 no XCode 4.2):
Ao pressionar qualquer botão, os métodos regulares de delegação serão chamados e você poderá extrair o textInput da seguinte maneira:
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,
UIAlertView
mas 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
UITextField
e editar como normal (programaticamente). Para isso, construí um alertView, como você especificou na sua pergunta original. Antes tarde do que nunca, certo :-)?Isso produz este alerta:
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
UIAlertView
demissão seja descartada (não háshouldDismiss
função delegada AFAIK), portanto, suponho que, se a entrada do usuário for inválida, você deverá colocar um novo alerta (ou apenas refazershow
este) até que a entrada correta seja inserido.Diverta-se!
fonte
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):
No Swift (iOS 8-10):
No Objective-C (iOS 8):
PARA iOS 5-7:
NOTA: Abaixo não funciona com o iOS 7 (iOS 4-6 funciona)
Apenas para adicionar outra versão.
depois ligo
[alert show];
quando quero.O método que acompanha
fonte
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
método delegado para obter o valor do textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`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:
fonte
Desde o IOS 9.0, use UIAlertController:
fonte
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
viewAlert
método para os botões daUIAlertView
mensagem. 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.
fonte
Experimente este código Swift em um UIViewController -
fonte
Swift 3:
fonte
Eu usaria um
UIAlertView
com umaUITextField
subview. Você pode adicionar o campo de texto manualmente ou, no iOS 5, usar um dos novos métodos.fonte
code
UIAlertView * 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];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).
fonte
No Xamarin e C #:
fonte
Com base na resposta de John Riselvato, para recuperar a string de volta do UIAlertView ...
fonte
fonte