限制 Swift 中多个 UITextField 的长度 2

Limit length of multiple UITextFields in Swift 2

限制TextField长度的解决方案,但是函数count已经更新,还有count()函数,所以我不明白如何使用这个:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newLength = count(textField.text.utf16) + count(string.utf16) - range.length
    return newLength <= 10 // Bool
}

以及如何更新它以在多个 TextField 上工作,我想我必须说如果

textField = thisTextField.text...

来自这个答案:Set the maximum character length of a UITextField

虽然 UITextField class 没有最大长度 属性,但通过设置文本字段的委托并实现以下委托方法来获得此功能相对简单:

Objective-C

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

Swift

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = textField.text?.characters.count ?? 0
    if (range.length + range.location > currentCharacterCount){
        return false
    }
    let newLength = currentCharacterCount + string.characters.count - range.length
    return newLength <= 25
}

编辑

这是根据评论更新的 swift 方法。

//  assume you have the following 3 fields
let textField1 = UITextField()
let textField2 = UITextField()
let textField3 = UITextField()

// then declare this dictionary
let lengthsDictionary = [textField1 : 10, textField2: 20, textField3: 30]


func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    guard let length = lengthsDictionary[textField] else {
        return true
    }

    let currentCharacterCount = textField.text?.characters.count ?? 0
    if (range.length + range.location > currentCharacterCount){
        return false
    }
    let newLength = currentCharacterCount + string.characters.count - range.length
    return newLength <= length
}

shouldChangeCharactersInRange 执行以下操作(引用自 docs

Asks the delegate if the specified text should be changed.

您添加到此方法的代码会检查它是否超过您的限制(在您的示例中为 10)和 returns false,这意味着 textField 不应更改值。如果没有超过限制,它将 return 为真,文本字段将更改值。

要为多个文本字段执行此操作,您需要有多个文本字段的出口,然后此方法中的一个简单的 if 语句就可以完成这项工作。

@IBOutlet weak var textfield1: UITextField!
@IBOutlet weak var textfield2: UITextField!

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newLength = textField.text.characters.count + string.characters.count - range.length
    if textField == textField1 {
        return newLength <= 10 // Bool
    } else if textField == textField2 {
        return newLength <= 15 // Bool
    }

    return true
}

为了能够在您的代码中使用上述方法,包含这些文本字段的 UIViewController 需要实施 UITextFieldDelegate 协议,然后通过设置 UITextField' s 委托 属性 成为 UIViewController.

还有关于 count 方法。它已经更新了很多次。要计算字符串的字符数:

Swift1.2 之前 -> countElements(string)
Swift1.2 -> count(string)
Swift2 -> string.characters.count

如果您想对多个文本字段的章程应用限制,请在 IB 中设置标签值。例如,您有 2 个文本字段,所需的文本限制为 3,4,因此为各自的文本字段设置 3 和 4 标签,并在 shouldChangeCharactersInRange 方法

中添加以下代码
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let characterCount = textField.text?.characters.count ?? 0
    if (range.length + range.location > characterCount){
        return false
    }
    let newLength = characterCount + string.characters.count - range.length
    return newLength <= textField.tag
}
func textField(
    _ textField: UITextField,
    shouldChangeCharactersIn range: NSRange,
    replacementString string: String)
-> Bool {
    
    var currentText = ""
    if textField == passwordTextField{
        currentText = textField.text ?? ""
    } else if textField == againPasswordTextField{
        currentText = textField.text ?? ""
    }

    guard let stringRange = Range(range, in: currentText) else { return false }
    let updatedText = currentText.replacingCharacters(in: stringRange, with: string)
    return updatedText.count <= 6
}

}

对我有用:)