【问题标题】:UITextField Autocomplete with max length具有最大长度的 UITextField 自动完成
【发布时间】:2019-09-13 22:34:47
【问题描述】:

我目前正在尝试在 UITextField 上设置最大长度,根据 UITextField 委托方法可以正常工作

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let currentText = textField.text ?? ""
    guard let stringRange = Range(range, in: currentText) else { return false }

    let updatedText = currentText.replacingCharacters(in: stringRange, with: string)

    return updatedText.count <= 9
}

我遇到的问题是在使用自动完成时已经输入了一些文本。

例如,UITextField 设置为具有邮政编码的内容类型。如果我从空的UITextField 自动完成邮政编码LS27 8LN 或类似的,一切正常

一个示例问题是,如果我在UITextField 中已经有邮政编码LS,并且我自动完成LS27 9AL,示例代码中的updatedText 是LSLS27 9AL,它超过了我的最大长度。该范围的位置和长度也为 0

我注意到的一件事是,如果我一起删除委托方法,iOS 似乎无论如何都会替换 UITextField 中的当前文本。

【问题讨论】:

    标签: ios swift uikit


    【解决方案1】:

    试试这个 UITextField 扩展

    import UIKit
    
    private var __maxLengths = [UITextField: Int]()
    
    extension UITextField{
    
    private struct Constants {
        static let defaultMaxLength: Int = 150
    }
    @IBInspectable var maxLength: Int {
        get {
            guard let len = __maxLengths[self] else {
                return Constants.defaultMaxLength
            }
            return len
        }
        set {
            __maxLengths[self] = newValue
            self.addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    
    @objc func fix(textField: UITextField) {
        let text = textField.text
        textField.text = text?.safelyLimitedTo(length: maxLength)
    }
    
    func safelyLimitedTo(text: String, length n: Int) -> String {
        guard n >= 0, text.count > n else {
            return text
        }
        return String( Array(text).prefix(upTo: n) )
    }
    
    }
    

    他们设置你需要的 maxLenght,比如 textField.maxLength = 20

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 2011-02-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多