Как переключить защищенную текстовую запись 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
}
Назначьте показать/скрыть изображение кнопки в соответствии с выбранным состоянием/по умолчанию, нет необходимости создавать переменную или выход.