Set password protection in UITextView

前端 未结 3 1709
醉酒成梦
醉酒成梦 2021-01-28 01:31

Can i hide password in UITextView by * or any other symbol? I need to use UITextView instead of UITextField. I want to hide all characters of textView.

3条回答
  •  孤独总比滥情好
    2021-01-28 02:05

    I like to share my own implementation after using the previous answers for a while in a chat-like app, where the UITextView is constantly filled and emptied.

    My UITextView works as an entry of text for different kind of data types (phones, e-mails, etc.) and I did not want to create other UITextView specifically for handling this scenario, so I decided to subclass it and restructure a little bit the code because I faced with circumstances that the logic breaks when using an external keyboard or changing the text property programatically (doing the last one does not call the delegate method).

    So first subclassing...

    UITextView subclass

    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: The overriding of the text property helps us to get always the plain text in the UITextView without calling other variables.


    Then, in the view controller where the delegate is implemented...

    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 "•"
            }
        }
    
    }
    

    Finally, you only need to toggle the isProtected flag somewhere in MyViewController and that`s it:

    myTextView.isProtected = true //or `false`
    

提交回复
热议问题