【问题标题】:Track multiple UITextField's text length跟踪多个 UITextField 的文本长度
【发布时间】:2015-11-27 09:15:16
【问题描述】:

我想跟踪 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;

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

【问题讨论】:

  • 你可以检查 self.textField.text 的长度而不是字符串的长度,但我建议你使用 Reactive Cocoa
  • 是的,但是问题是下一种情况:如果文本字段为空,我输入一个字符,它仍然检测到它是空的,因为在前一个字符串被替换之前触发了应该方法(一个字符)。
  • @Stefan 点击按钮时直接检查不是更好吗?该按钮始终处于启用状态,当单击按钮时,您检查 textField.text.length 并且如果为 0,则返回一个 uialertview 以传达文本字段为空
  • 是的,但规范要求如果这两个字段未填充,则禁用该按钮...
  • 是真的,我不记得了。如果您检查 textField 是否有一些文本,然后使用 [textField.text stringByReplacing...] 创建一个新字符串并检查该字符串的长度怎么办?顺便说一句,我认为 ReactiveCocoa 非常适合这个。

标签: ios objective-c iphone uitextfield


【解决方案1】:

您不需要委托。您可以为文本字段连接 IBAction“编辑确实更改”.. 在其中您可以这样做

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

【讨论】:

    【解决方案2】:

    你在正确的轨道上,但你应该考虑更改后的文本长度。

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

    - (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 操作(如果电子邮件文本看起来无效,则显示为红色......)。但是,如果您只需要检查文本的长度(编辑后),那么罗伯托斯的答案会更优雅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2014-06-23
      相关资源
      最近更新 更多