最大长度UITextField

Gio*_*era 107 character max uitextfield ios swift

当我试过你如何使用swift设置可以输入UITextField的最大字符数?,我看到如果我使用全部10个字符,我也无法删除该字符.

我唯一能做的就是取消操作(一起删除所有字符).

有谁知道如何不阻止键盘(所以我不能添加其他字母/符号/数字,但我可以使用退格键)?

Ima*_*tit 268

使用Swift 4.2和iOS 12,尝试以下实现,textField(_:shouldChangeCharactersIn:replacementString:)这是UITextFieldDelegate协议的一部分:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}
Run Code Online (Sandbox Code Playgroud)

但是,根据您的需要,您可能更喜欢以下实现之一(有关更多详细信息,请参阅Swift 2中的字符串):

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let textFieldText = textField.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= 10
    }

}
Run Code Online (Sandbox Code Playgroud)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}
Run Code Online (Sandbox Code Playgroud)
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let textFieldText = textField.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= 10
    }

}
Run Code Online (Sandbox Code Playgroud)

下面的完整的示例代码展示了如何实现rangeNSRange:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}
Run Code Online (Sandbox Code Playgroud)

  • 对于Swift 4,不建议使用`text.characters.count`使用`text.count` (4认同)

Mar*_*tin 45

我是这样做的:

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    if (countElements(textField.text!) > maxLength) {
        textField.deleteBackward()
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码适合我.但我使用故事板.在故事板中,我在视图控制器中为编辑更改添加了文本字段的操作.

  • countElements 在 Swift 2 中已更改为 count,但更改它对我有用! (2认同)

Sha*_* Ye 28

Swift 4的更新

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
     guard let text = textField.text else { return true }
     let newLength = text.count + string.count - range.length
     return newLength <= 10
}
Run Code Online (Sandbox Code Playgroud)


moh*_*sen 17

您可以扩展 UITextField 并添加一个@IBInspectable对象来处理它:

快速 5

import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let l = __maxLengths[self] else {
                return 150 // (global default-limit. or just, Int.max)
            }
            return l
        }
        set {
            __maxLengths[self] = newValue
            addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    @objc func fix(textField: UITextField) {
        if let t = textField.text {
            textField.text = String(t.prefix(maxLength))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在属性检查器上定义它

在此处输入图片说明

请参阅Swift 4 原始答案

  • 漂亮、干净的代码。但由于某种原因,当您使用表情符号时,这会导致奇怪的编辑行为。每次尝试编辑时,光标都会跳到行尾。 (2认同)

Sru*_*Suk 15

从@Martin回答中添加更多细节

// linked your button here
@IBAction func mobileTFChanged(sender: AnyObject) {
    checkMaxLength(sender as! UITextField, maxLength: 10)
}

// linked your button here
@IBAction func citizenTFChanged(sender: AnyObject) {
    checkMaxLength(sender as! UITextField, maxLength: 13)
}

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    // swift 1.0
    //if (count(textField.text!) > maxLength) {
    //    textField.deleteBackward()
    //}
    // swift 2.0
    if (textField.text!.characters.count > maxLength) {
        textField.deleteBackward()
    }
}
Run Code Online (Sandbox Code Playgroud)


Sai*_*ddy 10

在Swift 4中

10个字符限制文本字段并允许删除(退格)

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField ==  userNameFTF{
            let char = string.cString(using: String.Encoding.utf8)
            let isBackSpace = strcmp(char, "\\b")
            if isBackSpace == -92 {
                return true
            }
            return textField.text!.count <= 9
        }
        return true
    }
Run Code Online (Sandbox Code Playgroud)


Jer*_*ews 8

func checkMaxLength(textField: UITextField!, maxLength: Int) {
        if (textField.text!.characters.count > maxLength) {
            textField.deleteBackward()
        }
}
Run Code Online (Sandbox Code Playgroud)

IOS 9的一个小改动


Bas*_*ano 7

斯威夫特3

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

            let nsString = NSString(string: textField.text!)
            let newText = nsString.replacingCharacters(in: range, with: string)
            return  newText.characters.count <= limitCount
    }
Run Code Online (Sandbox Code Playgroud)


awe*_*wex 6

雨燕5

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == myTextFieldName {
        if range.location > 10 {
            return false
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

或者

func textFieldDidChangeSelection(_ textField: UITextField) {
    myTextFieldName.text = String(myTextFieldName.text!.prefix(10))
}
Run Code Online (Sandbox Code Playgroud)


max*_*ell 5

如果要覆盖最后一个字母:

let maxLength = 10

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

    if range.location > maxLength - 1 {
        textField.text?.removeLast()
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)


小智 5

雨燕5

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let MAX_LENGTH = 4
        let updatedString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
        return updatedString.count <= MAX_LENGTH
    }
Run Code Online (Sandbox Code Playgroud)