Какао - Как сделать так, чтобы текстовое поле не позволяло вводить текст, когда в NSTextfield достигнута максимальная длина? - PullRequest
0 голосов
/ 08 февраля 2019

Я новичок в разработке MAC.Если ответ уже объяснен, пожалуйста, добавьте ссылку в комментариях.Я уберу вопрос в этом случае.

В настоящее время, если длина текстового поля достигает максимального значения, я показываю предупреждение. Но все же последний введенный символ присутствует в текстовом поле, поэтому пользователю требуется возврат.

Я также пытался использовать NSFormatter, но не смог.

// CODE

override func controlTextDidChange(_ obj: Notification) {
  if let textField = obj.object as? NSTextField {
     if textField.stringValue.count > x {
         // display alert
     }
  }
}

Я ожидаю, что пользователь должен вводить текст, но текст не должен отображаться,Вместо оповещения не следует разрешать ввод текста, как мы делаем в сети.

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

1 Ответ

0 голосов
/ 22 февраля 2019

В самом простом случае все, что вам нужно, это создать подкласс Formatter и переопределить 3 метода:

class MyFormatter: Formatter {
    var maxLength = Int.max

    override func string(for obj: Any?) -> String? {
        return obj as? String
    }

    override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
        obj?.pointee = string as NSString
        return true
    }

    override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
        return partialString.count <= maxLength
    }
}

Затем установите форматер для вашего текстового поля:

let formatter = MyFormatter()
formatter.maxLength = 10

textField.formatter = formatter

Этого достаточнодля защиты от пользователей, набирающих более 10 символов или вставляющих строки длиной более 10 символов.Если вам нужны более продвинутые функции, такие как получение первых 10 символов при вставке в длинную строку, вы должны переопределить isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:).

...