Existe uma solução muito mais elegante que me surpreendeu na primeira vez que a vi. Benefícios:
- Mais próximo da implementação do campo de texto OSX, onde um campo de texto sabe para onde o foco deve seguir
- Não depende da configuração ou uso de tags - que são frágeis da IMO para este caso de uso
- Pode ser estendido para trabalhar com ambos
UITextField
e UITextView
controles - ou qualquer controle da interface do usuário da entrada do teclado
- Não bagunça seu controlador de exibição com o código delegado UITextField padrão
- Integra-se perfeitamente ao IB e pode ser configurado através da opção familiar arrastar e soltar para conectar tomadas.
Crie uma subclasse UITextField que tenha uma IBOutlet
propriedade chamada nextField. Aqui está o cabeçalho:
@interface SOTextField : UITextField
@property (weak, nonatomic) IBOutlet UITextField *nextField;
@end
E aqui está a implementação:
@implementation SOTextField
@end
No seu controlador de exibição, você criará o -textFieldShouldReturn:
método delegate:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ([textField isKindOfClass:[SOTextField class]]) {
UITextField *nextField = [(SOTextField *)textField nextField];
if (nextField) {
dispatch_async(dispatch_get_current_queue(), ^{
[nextField becomeFirstResponder];
});
}
else {
[textField resignFirstResponder];
}
}
return YES;
}
No IB, altere seu UITextFields para usar a SOTextField
classe Em seguida, também no IB, defina o delegado para cada um dos 'SOTextFields' para 'Proprietário do arquivo' (que é exatamente onde você coloca o código para o método de delegação - textFieldShouldReturn). A beleza desse design é que agora você pode simplesmente clicar com o botão direito do mouse em qualquer campo de texto e atribuir a saída nextField ao próximo SOTextField
objeto que você deseja que seja o próximo respondedor.
Além disso, você pode fazer coisas legais como fazer um loop no campo de texto para que, depois que o último perca o foco, o primeiro receba o foco novamente.
Isso pode ser facilmente estendido para atribuir automaticamente a returnKeyType
de a SOTextField
a UIReturnKeyNext
se houver um nextField atribuído - menos uma coisa configurada manualmente.