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.

questionAnswers(4)

yourAnswerToTheQuestion