【问题标题】:How to check text field input at real time?如何实时检查文本字段输入?
【发布时间】:2011-12-13 03:26:21
【问题描述】:

我正在为我的文本字段编写验证,我发现了一些有趣的事情,即我是否可以实时检查我在文本字段中输入了多少数字。我的文本字段输入必须是 8 位数字。因此,我想在达到 8 位时将文本字段内的文本更改为绿色,而不是更改颜色。

我该怎么做?请帮助我,提前谢谢。

【问题讨论】:

    标签: ios cocoa-touch uitextfield


    【解决方案1】:

    使用-textField:shouldChangeCharactersInRange:replacementString: 可能是一个糟糕的解决方案,因为它会在文本字段更新之前触发。当您想在键盘自动更新之前更改文本字段的文本时,可能应该使用此方法。在这里,您可能希望在编辑值更改时简单地使用目标-动作配对:

    [textField addTarget:self action:@selector(checkTextField:) forControlEvents:UIControlEventEditingChanged];
    

    然后,在- (void)checkTextField:(id)sender,试试这个:

    UITextField *textField = (UITextField *)sender;
    if ([textField.text length] == 8) {
        textField.textColor = [UIColor greenColor]; // No cargo-culting please, this color is very ugly...
    } else {
        textField.textColor = [UIColor blackColor];
        /* Must be done in case the user deletes a key after adding 8 digits,
           or adds a ninth digit */
    }
    

    【讨论】:

    • 这绝对是最好的解决方案。我使用-textField:shouldChangeCharactersInRange:replacementString: 遇到了一个问题
    • 是的!请记住,当调用该方法时,文本字段的文本尚未更改。
    • 同意,比我见过的任何其他解决方案都要好!
    • 一直使用 textField:shouldChangeCharactersInRange:replacementString.. 这个解决方案看起来很棒。
    【解决方案2】:
    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
    //    [textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
        NSLog(@"%@",searchStr);
        return YES;
    }
    

    【讨论】:

      【解决方案3】:

      使用UITextFieldDelegate。尤其是这个功能

      - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
      

      您可以从here..获取示例代码链接。

      【讨论】:

      • 接受的解决方案更好,因为正如@aopsfan 提到的那样:Using -textField:shouldChangeCharactersInRange:replacementString: is probably a bad solution because it fires before the text field updates. 因此,您失去了“实时”要求,并且更新落后一个字符(一个接一个)。跨度>
      • 不,这是正确的方法。处理字符串以复制字符串的未来版本很简单。此外,Apple 在其文档中建议将其用于实时检查和验证。
      【解决方案4】:
      [textField addTarget:self action:@selector(checkTextField) forControlEvents:UIControlEventEditingChanged];
      

      试试吧!

      【讨论】:

        【解决方案5】:

        UITextField 设置一个委托并实现– textField:shouldChangeCharactersInRange:replacementString: 方法详细信息和示例在UITextFieldDelegate Protocol Reference,但这里有一个简单的示例:

        - (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string
        {
                NSString *text = [textField text];
                // NOT BACKSPACE
                if ([string length] || text.length + string.length < 8) {
                    return YES;
                } else if (text.length + string.length > 8) {
                    return NO;
                } else {
                        // DO SOMETHING FOR LENGTH == 8
                        return YES;
                }
        }   
        

        【讨论】:

          【解决方案6】:

          更新 Swift 4.0

           txtFieldAdd.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
          

          现在调用你的函数。就我而言,这将启用保存按钮

          @objc func textFieldDidChange(_ textField: UITextField) {
              if (txtFieldAdd.text?.isEmpty)! {
                  btnSave.isEnabled = false
              }
              else {
                  btnSave.isEnabled = true
              }
          }
          

          希望对你有帮助。

          【讨论】:

            【解决方案7】:

            这是您在不设置文本字段委托以外的任何其他内容的情况下获得实时验证的方式:

            func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            
                // Creating the future string. The incoming string can be a single character,
                // empty (on delete) or many characters when the user is pasting text.
            
                let futureString: String = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
            
                // Determine if the change is allowed, update form, etc.
                let allowChange = <#Your Validation Code#>
            
                return allowChange
            }
            

            将此代码添加到文本字段的指定委托。很简单。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多