Я хотел бы поделиться своей собственной реализацией после использования предыдущих ответов некоторое время в приложении, похожем на чат, где UITextView
постоянно заполнен и опорожнен.
Моя UITextView
работает как записьтекста для различных типов данных (телефоны, электронная почта и т. д.), и я не хотел создавать другие UITextView
специально для обработки этого сценария, поэтому я решил выделить его подкласс и немного реструктурировать код, потому что яСтолкнувшись с обстоятельствами, что логика ломается при использовании внешней клавиатуры или программном изменении свойства text
(выполнение последнего не вызывает метод делегата ).
Итак, первое подклассирование ...
UITextView
подкласс
class MyTextView: UITextView {
var isProtected = false // `true` for activate the password mode
var plainText: String! = String() // Variable to save the text when `isProtected`
override var text: String! {
get { return isProtected ? plainText : super.text }
set {
if !isProtected {
plainText = newValue
}
super.text = newValue
}
}
}
PS: переопределение свойства text
помогает нам всегда получать простой текст в UITextView
безвызов других переменных.
Затем в контроллере представления, в котором реализован делегат ...
UITextViewDelegate
extension MyViewController: UITextViewDelegate {
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if myTextView.isProtected {
myTextView.plainText = (myTextView.plainText as NSString).replacingCharacters(in: range, with: text) // Basically: when is in password mode, saves all written characters in our auxiliar variable
}
return true
}
func textViewDidChange(_ textView: UITextView) {
if myTextView.isProtected {
textView.text = String(repeating: "•", count: textView.text.count) // Change every letter written with the character "•"
}
}
}
Наконец,вам нужно только тогВозьмите флаг isProtected
где-нибудь в MyViewController
и все:
myTextView.isProtected = true //or `false`