如何使用协议扩展为UITextfield的最大文本长度创建自定义类?

问题描述 投票:0回答:1

我创建了具有扩展名的协议,并正确设置了textfield方法,但是当我创建自定义类时,我获取了值,但无法发送回协议。

protocol Limiter {
    var  limit : Int {get set}
}
extension UIViewController: UITextFieldDelegate{

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

              // add their new text to the existing text
              let updatedText = tf.replacingCharacters(in: stringRange, with: string)

              print(updatedText)
        return updatedText.count  <= (textField as! Limiter).limit
     }

}
//Custom class 
class TextFieldLimiter: UITextField , Limiter{
    var limit: Int = 0

 @IBInspectable var maxLength: Int {
   get {
    print(limit)
     return limit
   }
   set {
     limit = newValue
    print(limit)
   }
 }   
}

我尝试了此代码,不确定是否做得正确。

所以,请帮帮我...

提前谢谢您

ios swift swift5
1个回答
0
投票

您可以使用此扩展名

import UIKit

// 1
private var maxLengths = [UITextField: Int]()

// 2
extension UITextField {

    // 3
    @IBInspectable var maxLength: Int {
        get {
            // 4
            guard let length = maxLengths[self] else {
                return Int.max
            }
            return length
        }
        set {
            maxLengths[self] = newValue
            // 5
            addTarget(
                self,
                action: #selector(limitLength),
                for: UIControl.Event.editingChanged
            )
        }
    }

    @objc func limitLength(textField: UITextField) {
        // 6
        guard let prospectiveText = textField.text, prospectiveText.count > maxLength else {
            return
        }

        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = prospectiveText.substring(to: maxCharIndex)
        selectedTextRange = selection

    }


}
© www.soinside.com 2019 - 2024. All rights reserved.