跟踪多个 UITextField 的文本长度

Track multiple UITextField's text length

我想跟踪 2 UITextField,如果它们为空,则“完成”按钮将被禁用。在 viewDidLoad 中,我禁用了按钮,因为所有 UITextField 都是空的。所有文本字段都有委托,我正在 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

中跟踪它们的状态
if (textField == self.emailTextField) {
        if (self.passwordTextField.hasText && [string length] > 0) {
            [self.loginButton setEnabled:YES];
        }
        else {
            [self.loginButton setEnabled:NO];
        }
    }
    else if (textField == self.passwordTextField) {
        if (self.emailTextField.hasText && [string length] > 0) {
            [self.loginButton setEnabled:YES];
        }
        else {
            [self.loginButton setEnabled:NO];
        }
    }

    return YES;

我知道这不是跟踪的最佳解决方案,因为现在当有人只删除字符、字符串为空且按钮被禁用时,我遇到了问题。在此先感谢您与我一起寻找最佳解决方案。

您不需要代表。您可以为文本字段连接 IBAction "edit did change".. 并在其中执行

- (IBAction)textFieldChanged:(UITextField *)sender {
    [self.loginButton setEnabled:(self.passwordTextField.hasText && self.emailTextField.hasText)];
}

你的思路是正确的,但你应该考虑到更改后的文本长度。

这里有很多关于如何做到这一点的例子。像这样:

- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
    NSString *resultString = [textField.text stringByReplacingCharactersInRange:range
                                                                     withString:string];

    size_t emailLen = [textField isEqual:_emailTextField] ? 
        resultString.text.length : _emailTextField.text.length;

    size_t pwdLen = [textField isEqual:_passwordTextField] ? 
        resultString.text.length : _passwordTextField.text.length;

    self.loginButton.enabled = emailLen && pwdLen;

    return YES;
}

在此方法中,还可以执行一些 UI 操作(如果电子邮件文本看起来无效,则显示为红色...)。但是,如果您只需要检查文本的长度(编辑后),那么罗伯托斯的回答会更优雅。