Desativar botão até que os campos de texto sejam inseridos?
Eu tenho vários campos uitext dentro de uma visualização e gostaria de desativar o uibutton até que todos os campos tenham algo inserido neles. Qual é a melhor maneira de fazer isso? Idealmente, eu gostaria de fazer alguma validação básica (verifique se todas as entradas são números) também.
EDITAR
Não foi possível obter as soluções abaixo para funcionar. Abaixo está a versão que eu comecei a trabalhar (remendada de Brad, Mike e várias outras fontes)
Use o UITextFieldDelegate
Crie campos de texto no IB e anexe-os aos IBOutlets relevantes - textField1, textField2 etc
Crie e conecte o botão ao seu IBOutlet relevante (submitButton) e IBAction (submitAction) no IB. Desmarque a opção ativada no IB.
Crie um método de validação no controlador de exibição:
-(IBAction)validateTextFields:(id)sender
{
// make sure all fields are have something in them
if ((textField1.text.length > 0) && (textField2.text.length > 0) && (textField3.text.length > 0)) {
self.submitButton.enabled = YES;
}
else {
self.submitButton.enabled = NO;
}
}
Conecte o evento 'Editing Changed' de cada campo ao método validateTextFields. (Observação: o evento 'Valor alterado' não parece funcionar)
Use este método delegado para limitar caracteres (no meu caso, para números e até um ponto final). Este bit é de Erica Sadun.
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *cs;
NSString *filtered;
// Check for period
if ([textField.text rangeOfString:@"."].location == NSNotFound)
{
cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
// Period is in use
cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
Voila.