如何在Swift中切换UITextField安全文本条目(隐藏密码)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中切换UITextField安全文本条目(隐藏密码)?相关的知识,希望对你有一定的参考价值。

我目前有一个带有眼睛图标的UITextfield,按下时应该打开和关闭安全文本条目。

secure text entry

我知道您可以在属性检查器中选中“安全文本输入”框,但是如何操作它以便在按下图标时切换?

答案

使用此代码,

iconClick是bool变量,或者你需要其他条件检查它,

var iconClick = true

眼动作方法:

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

        iconClick = !iconClick
    }

希望它有所帮助

另一答案

正如其他人所说,该属性是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;
    }
}
另一答案

这是你的答案,不需要采取任何bool var:

@IBAction func showHideAction(sender: AnyObject) {

        if tfPassword.secureTextEntry{
            tfPassword.secureTextEntry = false

        }else{
            tfPassword.secureTextEntry = true;
        } 
    }
另一答案

首先你需要为不同状态(选定或正常)设置眼睛按钮的图像(可见或隐藏)

比连接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"

另一答案

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

}
另一答案

如果你需要在多个地方具有类似功能的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()
    }

}
另一答案

赋值从YES/NO变为true/false布尔值。

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

你可以尝试这个代码..我认为这是有帮助的。

另一答案

使用带眼睛图像的按钮 并制作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;
      }
}
另一答案

对于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

        default:
          break
        }

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

    }
另一答案

为什么要使用额外的var。在眼睛按钮的动作方法中,只需执行以下操作

password.secureTextEntry = !password.secureTextEntry

UPDATE

Swift 4.2(根据@ROC评论)

password.isSecureTextEntry.toggle()
另一答案
@objc func togglePasscode(){

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

使用Switch语句,这是一个简单易读的解决方案。

另一答案

Shortest!

我认为这是安全进入以及更新按钮图片的最短解决方案。

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

根据所选状态/默认分配按钮的显示/隐藏图片,无需创建任何变量或插座。

另一答案

这种意外的副作用是,如果用户切换到不安全状态,然后返回到安全状态,则在用户继续键入时将清除现有文本。除非我们重置所选的文本范围,否则光标也可能会以错误的位置结束。

下面是一个处理这些情况的实现(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 si

以上是关于如何在Swift中切换UITextField安全文本条目(隐藏密码)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中自动移动到下一个 UITextField

如何在 swift 中部分屏蔽 UITextField 文本?

如何在 Swift 中使用 UITextField 从图像中提取特定文本?

如何在 Swift 中防止 UITextField 中出现空白或空格?

Swift:点击 UITextField 时如何显示 UIPickerView

如何在 Swift 中创建 UITextField 对象数组?