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

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

безопасный ввод текста

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

Ответ 1

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

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

var iconClick = true

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

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

        iconClick = !iconClick
    }

надеюсь, это полезно

Ответ 2

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

password.secureTextEntry = !password.secureTextEntry

ОБНОВИТЬ

Swift 4.2 (согласно комментарию @ROC)

password.isSecureTextEntry.toggle()

Ответ 3

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

Ниже приведена реализация, которая обрабатывает эти случаи (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 должно быть хорошо.

Ответ 4

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!)
        }
    }

ОБНОВИТЬ

Swift 4.2

Вместо

password.isSecureTextEntry = !password.isSecureTextEntry

вы можете сделать это

password.isSecureTextEntry.toggle()

Ответ 5

Используйте UITextFiled rightView, чтобы показать кнопку переключения

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

Ответ 6

Для цели 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];
        }

    }
}

Ответ 7

Swift 3

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

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

Ответ 8

@IBAction func showHideAction(sender: AnyObject) {

    if yourtextfield.secureTextEntry{
        yourtextfield.secureTextEntry = false

    }else{
        yourtextfield.secureTextEntry = true;
    } 
}

Ответ 9

Swift 3

passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false

Ответ 10

Как отмечали другие, свойство 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
}

Ответ 11

Вот ваш ответ: не нужно брать любой bool var:

@IBAction func showHideAction(sender: AnyObject) {

        if tfPassword.secureTextEntry{
            tfPassword.secureTextEntry = false

        }else{
            tfPassword.secureTextEntry = true;
        } 
    }

Ответ 12

В Свифт 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
        }

}

Ответ 13

Если вам нужен TextField с похожей функцией в нескольких местах, лучше всего UITextField подкласс UITextField как в следующем примере -

import UIKit

class UIShowHideTextField: UITextField {

    let rightButton  = UIButton(type: .custom)

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    required override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    func commonInit() {
        rightButton.setImage(UIImage(named: "password_show") , for: .normal)
        rightButton.addTarget(self, action: #selector(toggleShowHide), for: .touchUpInside)
        rightButton.frame = CGRect(x:0, y:0, width:30, height:30)

        rightViewMode = .always
        rightView = rightButton
        isSecureTextEntry = true
    }

    @objc
    func toggleShowHide(button: UIButton) {
        toggle()
    }

    func toggle() {
        isSecureTextEntry = !isSecureTextEntry
        if isSecureTextEntry {
            rightButton.setImage(UIImage(named: "password_show") , for: .normal)
        } else {
            rightButton.setImage(UIImage(named: "password_hide") , for: .normal)
        }
    }

}

После чего вы можете использовать его в любом ViewController,

class ViewController: UIViewController {

    @IBOutlet var textField: UIShowHideTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.becomeFirstResponder()
    }

}

Ответ 14

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

@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;
    }
}

Ответ 15

Используйте кнопку с изображением глаза
и сделать метод 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;
      }
}

Ответ 16

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

Ответ 17

Значения присваивания изменяются от YES/NO до true/false булевых значений.

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

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

Ответ 18

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

чем подключить 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
        }
    }

это пример

Ответ 19

Для людей Xamarin:

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

Ответ 20

Попробуйте этот код в Swift 4, попытался создать код многократного использования в контроллере. Я установил другое изображение для кнопок в раскадровке, как показано в ссылке fooobar.com/questions/502878/...

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

        default:
          break
        }

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

    }

Ответ 21

@objc func togglePasscode(){

switch textfield.isSecureTextEntry{
      case true:  textfield.isSecureTextEntry = false 
      case false: textfield.isSecureTextEntry = tree 
}
}

Вот простое и удобочитаемое решение с использованием оператора Switch.

Ответ 22

Кратчайший!

Я думаю, что это самое короткое решение для безопасного входа, а также для обновления изображения кнопки.

@IBAction func toggleSecureEntry(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected
    textfieldPassword.isSecureTextEntry = !sender.isSelected
}

Назначьте показать/скрыть изображение кнопки в соответствии с выбранным состоянием/по умолчанию, нет необходимости создавать переменную или выход.