Установить защиту паролем в UITextView - PullRequest
0 голосов
/ 15 мая 2018

Могу ли я скрыть пароль в UITextView * или любым другим символом? Мне нужно использовать UITextView вместо UITextField. Я хочу скрыть все символы textView.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Создать глобальную переменную для строки пароля.

var passwordString = ""

Затем установите делегатов UITextView следующим образом:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    passwordString = ((passwordString ?? "") as NSString).replacingCharacters(in: range, with: text)
    return true
}

func textViewDidChange(_ textView: UITextView) {
//replace character with * or anyother character
    yourtextView.text = String(repeating: "*", count: (textView.text ?? "").count)
}

и не забудьте сделать это:

yourTextview.delegate = self
0 голосов
/ 24 октября 2018

Я хотел бы поделиться своей собственной реализацией после использования предыдущих ответов некоторое время в приложении, похожем на чат, где 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`
0 голосов
/ 15 мая 2018

Использование UITextView оставляет всю работу по маскировке текста самостоятельно. Вы также должны убедиться, что вы отключили копирование по соображениям безопасности. Установите свойство delegate и обработайте что-нибудь в следующих строках:

var originalText: String?

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    originalText = ((originalText ?? "") as NSString).replacingCharacters(in: range, with: text)
    return true
}

func textViewDidChange(_ textView: UITextView) {
    textView.text = String(repeating: "*", count: (textView.text ?? "").count)
}

Если вам нужно получить значение фактического введенного текста, используйте свойство originalText.

...