创建UITextFieldDelegate以限制Swift中的字符数

创建UITextFieldDelegate以限制Swift中的字符数,swift,xcode,delegates,uitextfield,uitextfielddelegate,Swift,Xcode,Delegates,Uitextfield,Uitextfielddelegate,我对学员是新手,我正在尝试使用UITextFieldDelegate进行实验。我的目标是将此文本字段中的字符数限制为五个字符,就像我正在创建邮政编码文本字段一样 我正在使用一个带有文本字段的现成视图控制器,并创建了一个名为ZipCodeDelegate.swift的代理文件。我修改了故事板中的文本字段,以便在用户点击该字段时显示数字键盘。这是我的viewController: import UIKit class ViewController: UIViewController, UIText

我对学员是新手,我正在尝试使用UITextFieldDelegate进行实验。我的目标是将此文本字段中的字符数限制为五个字符,就像我正在创建邮政编码文本字段一样

我正在使用一个带有文本字段的现成视图控制器,并创建了一个名为ZipCodeDelegate.swift的代理文件。我修改了故事板中的文本字段,以便在用户点击该字段时显示数字键盘。这是我的viewController:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

// MARK: Outlets

@IBOutlet weak var zipTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}
这是我的委托文件:

import Foundation
import UIKit

class ZipCodeDelegate: NSObject, UITextFieldDelegate {


}

我不知下一步该怎么办。我不确定如何限制文本字段的字符数,以及如何告诉视图控制器此委托文件存在并且它应该控制所述文本字段

将此
UITextField
委托用于Zipcode和
Int
限制字符计数

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

    if string.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil{
        let len = (textField.text?.characters.count)! + string.characters.count
        if len <= 5 {
            return true
        }
    }
    return false
}

Swift 4

public class LimitedUITextField: UITextField, UITextFieldDelegate {
    var maxNumber: Int = 0 {
        didSet {
            self.delegate = self
        }
    }


    public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let textFieldText = self.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= self.maxNumber
    }
}
public类LimitedUITextField:UITextField,UITextFieldDelegate{
变量maxNumber:Int=0{
迪塞特{
self.delegate=self
}
}
public func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
guard let textFieldText=self.text,
让rangeOfTextToReplace=Range(Range,in:textFieldText)else{
返回错误
}
let substringToReplace=textFieldText[rangeOfTextToReplace]
let count=textFieldText.count-substringstorereplace.count+string.count

return count可能与此SO post重复:类似是的,但我希望通过编程解决此问题,而不向情节提要中添加解决方案。Aladin的答案不是您需要的吗?它不使用情节提要。shouldChangeCharacters方法实现了此目的。我更新了viewController类以包括:let zipCodeDelegate=ZipCodeDelegate()以及在viewDidLoad方法中分配委托,如:self.zipTextField.delegate=ZipCodeDelegate我感谢您的帮助。您能解释一下第一个解决方案的工作原理吗?我不理解所使用的语法。必须阅读这篇文章
public class LimitedUITextField: UITextField, UITextFieldDelegate {
    var maxNumber: Int = 0 {
        didSet {
            self.delegate = self
        }
    }


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