最大长度UITextField

时间:2014-08-09 21:51:01

标签: ios swift uitextfield character max

当我尝试How to you set the maximum number of characters that can be entered into a UITextField using swift?时,我看到如果我使用全部10个字符,我也无法删除该字符。

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

有谁知道如何不阻挡键盘(这样我就无法添加其他字母/符号/数字,但我可以使用退格键)?

20 个答案:

答案 0 :(得分:256)

使用Swift 5和iOS 12,尝试以下textField(_:shouldChangeCharactersIn:replacementString:)方法的video tutorial方法实现:

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 } range)到NSRangerangeOfTextToReplace)的转换。请参阅此smartInsertDeleteType以了解此转化的重要性。
  • 要使此代码正常运行,您还应将Range<String.Index>的{​​{3}}值设置为textField。这样可以防止在执行粘贴操作时可能插入(不需要的)额外空间。

下面的完整示例代码显示了如何在UITextSmartInsertDeleteType.no中实施textField(_:shouldChangeCharactersIn:replacementString:)

UIViewController

答案 1 :(得分:41)

我这样做:

func checkMaxLength(textField: UITextField!, maxLength: Int) {
    if (countElements(textField.text!) > maxLength) {
        textField.deleteBackward()
    }
}

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

答案 2 :(得分:25)

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
}

答案 3 :(得分:14)

从@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()
    }
}

答案 4 :(得分:7)

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

IOS 9的一个小改动

答案 5 :(得分:7)

在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
    }

答案 6 :(得分:6)

Swift 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
    }

答案 7 :(得分:3)

我使用IBInspectable发布了一个解决方案,因此您可以在界面生成器中或以编程方式更改最大长度值。 Check it out here

答案 8 :(得分:3)

如果你想覆盖最后一个字母:

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

    if range.location > 9 {
        textField.text?.removeLast()
    }

    return true
}

答案 9 :(得分:2)

斯威夫特 5

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

答案 10 :(得分:1)

由于委托是一对一的关系,我可能想在其他地方出于其他原因使用它,我喜欢限制文本字段长度,在其设置中添加此代码:

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }

    required override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    func setup() {

        // your setup...

        setMaxLength()
    }

    let maxLength = 10

    private func setMaxLength() {
            addTarget(self, action: #selector(textfieldChanged(_:)), for: UIControlEvents.editingChanged)
        }

        @objc private func textfieldChanged(_ textField: UITextField) {
            guard let text = text else { return }
            let trimmed = text.characters.prefix(maxLength)
            self.text = String(trimmed)

        }

答案 11 :(得分:1)

快捷键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
    }

答案 12 :(得分:1)

我一直在我的一个应用程序中使用此协议/扩展程序,它更具可读性。我喜欢它如何识别退格并明确地告诉你角色什么时候退格。

需要考虑的一些事项:

1.无论如何实现此协议扩展都需要指定字符限制。这通常是您的ViewController,但您可以将字符限制实现为计算属性并返回其他内容,例如您的某个型号的字符限制。

<强> 2。您需要在文本字段的shouldChangeCharactersInRange委托方法中调用此方法。否则您将无法通过返回false等来阻止文本输入。

第3。您可能希望允许退格字符通过。这就是我添加额外函数来检测退格的原因。你的shouldChangeCharacters方法可以检查这个并在早期返回'true',这样你总是允许退格。

protocol TextEntryCharacterLimited{
    var characterLimit:Int { get } 
}

extension TextEntryCharacterLimited{

    func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{

        let startingLength = textField.text?.characters.count ?? 0
        let lengthToAdd = string.characters.count
        let lengthToReplace = range.length

        let newLength = startingLength + lengthToAdd - lengthToReplace

        return newLength <= characterLimit

    }

    func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{
        if range.length == 1 && string.characters.count == 0 { return true }
        return false
    }

}

如果你们有兴趣,我有一个Github回购,我已经采取了一些这个字符限制行为并放入iOS框架。你可以实现一个协议,以获得类似Twitter的字符限制显示,显示你超出字符限制的距离。

CharacterLimited Framework on Github

答案 13 :(得分:1)

Here is my version of code. Hope it helps!

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        let invalidCharacters = NSCharacterSet(charactersInString: "0123456789").invertedSet

        if let range = string.rangeOfCharacterFromSet(invalidCharacters, options: nil, range:Range<String.Index>(start: string.startIndex, end: string.endIndex))
        {
            return false
        }

        if (count(textField.text) > 10  && range.length == 0)
        {
            self.view.makeToast(message: "Amount entry is limited to ten digits", duration: 0.5, position: HRToastPositionCenter)
            return false
        }
        else
        {

        }

        return true
    }

答案 14 :(得分:1)

请注意本帖中提到的UITextField的撤消错误:Set the maximum character length of a UITextField

这是你如何在swift中修复它

if(range.length + range.location > count(textField.text)) {
        return false;
}

答案 15 :(得分:0)

您可以在swift 5或swift 4 like 中使用类似波纹管的图像 enter image description here

  1. 在View Controller中添加textField
  2. 将文本连接到ViewController
  3. 在视图ViewController中添加代码

     class ViewController: UIViewController , UITextFieldDelegate {
    
      @IBOutlet weak var txtName: UITextField!
    
      var maxLen:Int = 8;
    
     override func viewDidLoad() {
        super.viewDidLoad()
    
        txtName.delegate = self
       }
    
     func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
         if(textField == txtName){
            let currentText = textField.text! + string
            return currentText.count <= maxLen
         }
    
         return true;
       }
    }
    

您可以从GitHub下载完整源代码表单: https://github.com/enamul95/TextFieldMaxLen

答案 16 :(得分:0)

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

SWIFT 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))
        }
    }
}

然后在属性检查器上对其进行定义

enter image description here

请参见Swift 4 original Answer

答案 17 :(得分:0)

我正在使用它;

限制3个字符

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

        if let txt = textField.text {
            let currentText = txt + string
            if currentText.count > 3 {
                return false
            }
            return true
        }
        return true
    }

答案 18 :(得分:0)

这是我的简单回答,在 Swift 5.0 中使用 iOS 14+ 和 Xcode 12+...

viewDidLoad() 中添加以下选择器:

override func viewDidLoad() {
    // Add a target for myTextField, pointing to .editingDidChange
    myTextField.addTarget(self, action: #selector(myTextFieldDidChange(_:)), for: .editingChanged)
}

您还可以在班级的某个地方添加可选的字符限制:

// Add an optional character limit
let characterLimit = 100

然后在您的课程中,只需添加此功能:

@objc func myTextFieldDidChange(_ textField: UITextField) {
    textField.text = String(textField.text!.prefix(self.characterLimit))
}

这会在您键入时限制您的字符,当您将文本复制+粘贴到文本字段时。

答案 19 :(得分:-2)

您需要检查现有字符串加上输入是否大于10.

   func textField(textField: UITextField!,shouldChangeCharactersInRange range: NSRange,    replacementString string: String!) -> Bool {
      NSUInteger newLength = textField.text.length + string.length - range.length;
      return !(newLength > 10)
   }