Как мне создать собственный класс для максимальной длины текста UITextfield, используя расширение протокола? - PullRequest
0 голосов
/ 07 февраля 2020

Я создал протокол с расширением и правильно установил метод 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)
   }
 }   
}

Я попробовал этот код и не уверен, что я делаю правильно или нет.

Так что, пожалуйста, помогите мне ...

Заранее спасибо

1 Ответ

0 голосов
/ 07 февраля 2020

В Интернете можно найти несколько решений в зависимости от вашего использования.

Лучше всего использовать протокол UITextFieldDelegate, особенно textField(_:shouldChangeCharactersIn:replacementString:):

  • Вы можете позволить вашему подклассу TextFieldLimiter реализовать делегат и обработать там метод протокола.
    • Но это работает, только если не установлены другие делегаты, потому что может быть только один.
  • Вы можете реализовать делегата на контроллере представления и проверить, если отправитель - это TextFieldLimiter и проверьте ограничения там
    • Это может привести к повторному коду
    • Но вы можете оттуда делегировать его для написания validate функцию, которую вы бы реализовали в TextFieldLimiter

Вы также можете попробовать это в своем подклассе TextFieldLimiter без использования делегата, например переопределить override func canPerformAction и проверить, если это действие вставки, а затем проверьте, является ли буфер вставки слишком большим или нет, чтобы разрешить действие или нет. Но это немного сложнее, и вы должны также рассмотреть случай отменить .

...