J'ai actuellement une UITextfield
avec une icône en forme d'œil qui, lorsqu'elle est enfoncée, est supposée activer ou désactiver la saisie de texte sécurisée.
Je sais que vous pouvez cocher la case "saisie de texte sécurisée" dans l'inspecteur des attributs, mais comment le faire pour qu'il bascule chaque fois que vous appuyez sur l'icône?
Utilisez ce code,
iconClick est une variable booléenne, ou vous avez besoin d'une autre condition, cochez-la,
var iconClick = true
méthode d'action des yeux:
@IBAction func iconAction(sender: AnyObject) {
if(iconClick == true) {
passwordTF.secureTextEntry = false
} else {
passwordTF.secureTextEntry = true
}
iconClick = !iconClick
}
j'espère que c'est utile
Pourquoi utiliser une variable supplémentaire var
. Dans la méthode d’action du bouton œil , procédez comme suit:
password.secureTextEntry = !password.secureTextEntry
METTRE À JOUR
Swift 4.2 (selon le commentaire de @ROC)
password.isSecureTextEntry.toggle()
Un effet secondaire non voulu de cela est que si l'utilisateur bascule sur non sécurisé, puis sur retour sécurisé, le texte existant sera effacé si l'utilisateur continue à taper. Le curseur peut également se retrouver dans la mauvaise position à moins que nous ne réinitialisions la plage de texte sélectionnée.
Vous trouverez ci-dessous une implémentation qui gère ces cas (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
}
}
}
Cet extrait utilise la fonction replace(_:withText:)
car il déclenche l'événement .editingChanged
, ce qui s'avère utile dans mon application. Régler text = existingText
devrait également convenir.
Swift 4 solution
Vous n'avez pas besoin d'instruction if supplémentaire pour le basculement simple de la propriété isSecureTextEntry
func togglePasswordVisibility() {
password.isSecureTextEntry = !password.isSecureTextEntry
}
Mais il y a un problème lorsque vous basculez isSecureTextEntry UITextField ne recalcule pas la largeur du texte et nous avons un espace supplémentaire à droite du texte. Pour éviter cela, remplacez le texte de cette façon
func togglePasswordVisibility() {
password.isSecureTextEntry = !password.isSecureTextEntry
if let textRange = password.textRange(from: password.beginningOfDocument, to: password.endOfDocument) {
password.replace(textRange, withText: password.text!)
}
}
METTRE À JOUR
Swift 4.2
Au lieu de
password.isSecureTextEntry = !password.isSecureTextEntry
tu peux le faire
password.isSecureTextEntry.toggle()
Utilisez la vue de droite UITextField pour afficher le bouton bascule
var rightButton = UIButton(type: .custom)
rightButton.frame = CGRect(x:0, y:0, width:30, height:30)
yourtextfield.rightViewMode = .always
yourtextfield.rightView = rightButton
Pour l'objectif C
set image for RightButton In viewdidload, méthode
[RightButton setImage:[UIImage imageNamed:@"iconEyesOpen"] forState:UIControlStateNormal];
[RightButton setImage:[UIImage imageNamed:@"iconEyesClose"] forState:UIControlStateSelected];
puis définir la méthode d'action pour ce 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];
}
}
}
Swift 3
// MARK: Btn EyeAction
@IBAction func btnEyeAction(_ sender: Any) {
if(iconClick == true) {
txtPassword.isSecureTextEntry = false
iconClick = false
} else {
txtPassword.isSecureTextEntry = true
iconClick = true
}
}
Swift 3
passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false
Voici votre réponse, pas besoin de prendre n'importe quelle variable:
@IBAction func showHideAction(sender: AnyObject) {
if tfPassword.secureTextEntry{
tfPassword.secureTextEntry = false
}else{
tfPassword.secureTextEntry = true;
}
}
Comme d'autres l'ont noté, la propriété est secureTextEntry
, mais vous ne la trouverez pas dans la documentation UITextField
car elle est héritée par un UITextField
via le protocole UITextInputTraits
- https://developer.Apple.com/library//documentation/UIKit/Référence/UITextInputTrait_Protocol/# // Apple_ref/occ/intfp/UITextInputTraits/secureTextEntry
Vous pouvez simplement changer cette valeur chaque fois que vous appuyez sur le bouton:
@IBAction func togglePasswordSecurity(sender: UIButton) {
self.passwordField.secureTextEntry = !self.passwordField.secureTextEntry
}
Dans 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
}
}
Si vous avez besoin de TextField avec une fonctionnalité similaire à plusieurs endroits, il est préférable de sous-classer la UITextField
comme suit:
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)
}
}
}
Après quoi, vous pouvez l’utiliser dans n’importe quel ViewController,
class ViewController: UIViewController {
@IBOutlet var textField: UIShowHideTextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.becomeFirstResponder()
}
}
essayez cette ligne:
@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;
}
}
Utilisez le bouton avec l'image de l'oeil
et fabrique la méthode buttonHandler
définir le tag pour le bouton avec la valeur 1
-(IBAction) buttonHandlerSecureText:(UIButton *)sender{
if(sender.tag ==1){
[self.textField setSecureTextEntry:NO];
sender.tag = 2;
}
else{
[self.textField setSecureTextEntry:YES];
sender.tag = 1;
}
}
Essayez ce code dans Swift 4, essayez de créer un code réutilisable dans un contrôleur. J'ai défini une image différente pour les boutons du scénario, comme indiqué dans le lien 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)
}
@IBAction func eye_toggle_clicked(sender: AnyObject)
{
if toggleBtn.tag == 0
{
passwordTxt.secureTextEntry=true
toggleBtn.tag=1
}
else
{
passwordTxt.secureTextEntry=false
toggleBtn.tag=0
}
}
Les valeurs d'assignation changent de YES/NO
à true/false
valeurs booléennes.
password.secureTextEntry = true //Visible
password.secureTextEntry = false //InVisible
Vous pouvez essayer ce code ... Je pense que c'est utile.
Vous devez d’abord définir l’image (visible ou masquée) du bouton de l’œil pour un état différent (sélectionné ou normal)
que connecter IBAction et écrire du code comme
@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
}
}
Pour les Xamarins:
passwordField.SecureTextEntry = passwordField.SecureTextEntry? PasswordField.SecureTextEntry = false: PasswordField.SecureTextEntry = true