Как переключить защищенную текстовую запись UITextField (скрыть пароль) в Swift?

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

secure text entry

Я знаю, что вы можете установить флажок "безопасный ввод текста" в инспекторе атрибутов, но как это сделать, чтобы он переключался при нажатии значка?

18 ответов


используйте этот код,

iconClick-переменная bool, или вам нужно проверить другое условие,

var iconClick = true

метод действия глаза:

@IBAction func iconAction(sender: AnyObject) {
        if(iconClick == true) {
            passwordTF.secureTextEntry = false
        } else {
            passwordTF.secureTextEntry = true
        }

        iconClick = !iconClick
    }

надеюсь, что его полезным


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

password.secureTextEntry = !password.secureTextEntry

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

Ниже приведена реализация, которая обрабатывает эти случаи (Swift 4)

extension UITextField {
    func togglePasswordVisibility() {
        isSecureTextEntry = !isSecureTextEntry

        if let existingText = text, isSecureTextEntry {
            /* When toggling to secure text, all text will be purged if the user 
             continues typing unless we intervene. This is prevented by first 
             deleting the existing text and then recovering the original text. */
            deleteBackward()

            if let textRange = textRange(from: beginningOfDocument, to: endOfDocument) {
                replace(textRange, withText: existingText)
            }
        }

        /* Reset the selected text range since the cursor can end up in the wrong
         position after a toggle because the text might vary in width */
        if let existingSelectedTextRange = selectedTextRange {
            selectedTextRange = nil
            selectedTextRange = existingSelectedTextRange
        }
    }
}

этот фрагмент использует replace(_:withText:) функция, потому что она запускает .editingChanged событие, которое оказывается полезным в моем приложение. Просто установка text = existingText должно быть нормально.


Swift 4 решение

вам не нужен дополнительный оператор if для простого переключения свойства isSecureTextEntry

func togglePasswordVisibility() {
        password.isSecureTextEntry = !password.isSecureTextEntry
    }

но есть проблема, когда вы переключаете isSecureTextEntry UITextField не пересчитывает ширину текста, и у нас есть дополнительное пространство справа от текста. Чтобы избежать этого, вы должны заменить текст таким образом

func togglePasswordVisibility() {
        password.isSecureTextEntry = !password.isSecureTextEntry
        if let textRange = password.textRange(from: password.beginningOfDocument, to: password.endOfDocument) {
            password.replace(textRange, withText: password.text!)
        }
    }

для цели c

установить изображение для RightButton в методе viewdidload

[RightButton setImage:[UIImage imageNamed:@"iconEyesOpen"] forState:UIControlStateNormal];

    [RightButton setImage:[UIImage imageNamed:@"iconEyesClose"] forState:UIControlStateSelected];

а затем установите метод действия для этого RightButton

-(IBAction)RightButton:(id)sender
{

    if (_rightButton.selected)
    {

        _rightButton.selected = NO;

        _passwordText.secureTextEntry = YES;


        if (_passwordText.isFirstResponder) {
            [_passwordText resignFirstResponder];
            [_passwordText becomeFirstResponder];
        }
    }
    else
    {

      _rightButton.selected = YES;

        _passwordText.secureTextEntry = NO;

        if (_passwordText.isFirstResponder) {
            [_passwordText resignFirstResponder];
            [_passwordText becomeFirstResponder];
        }

    }
}

используйте uitextfiled правый вид, чтобы показать togle buuton

 var rightButton  = UIButton(type: .custom)
 rightButton.frame = CGRect(x:0, y:0, width:30, height:30)
 yourtextfield.rightViewMode = .always
 yourtextfield.rightView = rightButton

Swift 3

//    MARK: Btn EyeAction
@IBAction func btnEyeAction(_ sender: Any) {

    if(iconClick == true) {
        txtPassword.isSecureTextEntry = false
        iconClick = false
    } else {
        txtPassword.isSecureTextEntry = true
        iconClick = true
    }
}

вот ваш ответ нет необходимости принимать какие-либо bool var:

@IBAction func showHideAction(sender: AnyObject) {

        if tfPassword.secureTextEntry{
            tfPassword.secureTextEntry = false

        }else{
            tfPassword.secureTextEntry = true;
        } 
    }

Swift 3

passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false

В Swift 4

 var iconClick : Bool!

    override func viewDidLoad() {
        super.viewDidLoad()
        iconClick = true
     }


    @IBAction func showHideAction(_ sender: Any)
    {
        let userPassword = userPasswordTextFiled.text!;

        if(iconClick == true) {
            userPasswordTextFiled.isSecureTextEntry = false
            iconClick = false
        } else {
            userPasswordTextFiled.isSecureTextEntry = true
            iconClick = true
        }

}

@IBAction func eye_toggle_clicked(sender: AnyObject)
{
    if toggleBtn.tag == 0
    {
        passwordTxt.secureTextEntry=true
        toggleBtn.tag=1
    }
    else
    {
        passwordTxt.secureTextEntry=false
        toggleBtn.tag=0
    }
}

значения присваивания изменяются от YES/NO to true/false логические значения.

password.secureTextEntry = true //Visible
password.secureTextEntry = false //InVisible

вы можете попробовать этот код.. я думаю, это полезно.


как отмечали другие, свойство secureTextEntry, но вы не найдете этого в UITextField документация, поскольку она фактически наследуется UITextField до UITextInputTraits протокол - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/#//apple_ref/occ/intfp/UITextInputTraits/secureTextEntry

вы можете просто переключать это значение каждый раз, когда ваша кнопка нажата:

@IBAction func togglePasswordSecurity(sender: UIButton) {
    self.passwordField.secureTextEntry = !self.passwordField.secureTextEntry
}

попробуйте эту строку:

@IBAction func btnClick(sender: AnyObject) {
    let btn : UIButton = sender as! UIButton
    if btn.tag == 0{
        btn.tag = 1
        textFieldSecure.secureTextEntry = NO
    }
    else{
        btn.tag = 0
        textFieldSecure.secureTextEntry = NO;
    }
}

используйте кнопку с изображением глаза
и сделать buttonHandler метод
набор тегов для кнопки со значением 1

-(IBAction) buttonHandlerSecureText:(UIButton *)sender{
      if(sender.tag ==1){
            [self.textField setSecureTextEntry:NO];
            sender.tag = 2;
      }
      else{
            [self.textField setSecureTextEntry:YES];
            sender.tag = 1;
      }
}

сначала вам нужно установить изображение (видимое или скрытое) кнопки глаза для другого состояния (выбранного или нормального)

чем подключить IBAction и написать код, как

@IBAction func btnPasswordVisiblityClicked(_ sender: Any) {
        (sender as! UIButton).isSelected = !(sender as! UIButton).isSelected
        if (sender as! UIButton).isSelected {
            txtfPassword.isSecureTextEntry = false
        } else {
            txtfPassword.isSecureTextEntry = true
        }
    }

this is example of "How to set image for different state of button"


для людей Xamarin:

passwordField.SecureTextEntry = passwordField.SecureTextEntry ? passwordField.SecureTextEntry = false: passwordField.SecureTextEntry = true;


попробуйте этот код в swift 4, попытался сделать многоразовый код в контроллере. Я установил другое изображение для кнопок в раскадровке, как показано в ссылке https://stackoverflow.com/a/47669422/8334818

@IBAction func clickedShowPassword(_ sender: UIButton) {
        var textField :UITextField? = nil
        print("btn ",sender.isSelected.description)
        switch sender {
        case encryptOldPswdBtn:
            encryptOldPswdBtn.isSelected = !encryptOldPswdBtn.isSelected
            textField = oldPasswordTextField

        case encryptNewPswdBtn:
            encryptNewPswdBtn.isSelected = !encryptNewPswdBtn.isSelected
            textField = newPasswordTextField

        default:
          break
        }

        print("text ",textField?.isSecureTextEntry.description)
        textField?.isSecureTextEntry = !(textField?.isSecureTextEntry ?? false)

    }