it-swarm.com.ru

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

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

 secure text entry

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

33
SwiftyJD

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

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

var iconClick = true

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

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

        iconClick = !iconClick
    }

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

43
Iyyappan Ravi

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

password.secureTextEntry = !password.secureTextEntry

ОБНОВЛЕНИЕ 

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

password.isSecureTextEntry.toggle()
28
Suryakant

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

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

26
zath

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()
13
chibis0v

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

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

Для цели C  

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

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

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

а затем установить метод действия для этой правой кнопки

-(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];
        }

    }
}
5
Mad Burea

Swift 3

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

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

Swift 3

passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false
2
Christopher Larsen

Вот ваш ответ, нет необходимости принимать bool var:

@IBAction func showHideAction(sender: AnyObject) {

        if tfPassword.secureTextEntry{
            tfPassword.secureTextEntry = false

        }else{
            tfPassword.secureTextEntry = true;
        } 
    }
1
iVarun

Как уже отмечали другие, это свойство secureTextEntry, но вы не найдете его в документации UITextField, поскольку оно на самом деле наследуется UITextField через протокол UITextInputTraits- https://developer.Apple.com/library/ios/Документация/UIKit/Справка/UITextInputTraits_Protocol/# // Apple_ref/occ/intfp/UITextInputTraits/secureTextEntry

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

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

В 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
        }

}
1
Keshav Gera

Если вам нужен TextField с похожей функцией в нескольких местах, лучше всего подклассировать следующий пример, как 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()
    }

}
1
Bishal Ghimire

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

@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;
    }
}
0
Bhadresh Kathiriya

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

Попробуйте этот код в 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

        default:
          break
        }

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

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

Значения назначения изменяются с логических значений YES/NO на true/false.

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

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

0
Ravi Dhorajiya

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

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

0
singh.jitendra

Для людей Xamarin:

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

0
megaKertz