Obtendo o valor de um UITextField conforme as teclas são inseridas?

107

Digamos que eu tenha o seguinte código:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Gostaria greetingLabelde ler "Hello [nameTextField]" assim que o usuário pressionasse qualquer tecla.

O que eu preciso basicamente é o equivalente para iPhone do método de delegado Cocoa controlTextDidChange.

O textField:shouldChangeCharactersInRange:método delegado é chamado sempre que ocorre um pressionamento de tecla:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

O argumento string retorna o caractere que é pressionado. O textFieldvalor real ( nameTextField.text) permanece em branco, entretanto.

O que estou perdendo aqui? (Eu gostaria nameTextFieldde refletir a string exata que o usuário inseriu até agora).

PlagueHammer
fonte

Respostas:

197

Acontece que a maneira mais fácil de fazer isso é usando o Interface Builder:

  • Adicione um IBAction (para o ViewController, digamos, como neste caso)
  • Clique com a tecla Ctrl (ou clique com o botão direito) em UITextField no Interface Builder
  • Conecte o evento "Editing Changed" à IBAction do proprietário do arquivo adicionada na primeira etapa.

Funciona como um encanto :) (Não acredito que passei vários dias nisso, e perceber agora que a solução era muito mais simples do que eu pensava: P)

PlagueHammer
fonte
2
Obrigado! Eu estava usando "Value Changed" como você usaria com um UISlider, etc. É interessante que eles tenham dois eventos que parecem ter o mesmo comportamento.
wjl
1
Por algum motivo, eu ainda queria uma maneira programática de fazer isso ... mas desisti ... Esse método é demais! Obrigado por compartilhar ... Eu já tinha visto isso antes, mas depois de dias codificando meu cérebro não está mais funcionando hehe.
Albert Renshaw
8
@AlbertRenshaw Mas você pode fazer isso de forma programática;) Basta executar [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive
101

você pode registrar uma ação para o evento UIControlEventEditingChanges no campo de texto:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

fonte
Existe uma maneira de especificar isso usando o Interface Builder?
PlagueHammer
11

UITextFieldtem uma notificação UITextFieldTextDidChangeque será disparada toda vez que o texto mudar se você se registrar nele. Basta se cadastrar para aquela notificação e no método chamado pela notificação, alterar o texto do rótulo.

Para adicionar a isso, o objeto passado para seu manipulador de notificação terá o texto de UITextField.

Espero que ajude.

perdido em trânsito
fonte