Нежелательное поведение текстового поля защищенного пароля Xcode 12.2

#ios #uikit #uitextfield

#iOS #uikit #uitextfield

Вопрос:

Я создал контроллер представления регистрации с 3 текстовыми полями для электронной почты, имени пользователя и пароля. Вот весь файл контроллера представления:

 //
//  SignupViewController.swift
//  bounce_frontend
//
//  Created by Sebastian Fay on 11/21/20.
//

import UIKit

class SignupViewController: UIViewController {
    
    struct Constants {
        static let cornerRadius: CGFloat = 5.0
    }
    
    private let emailField: UITextField = {
        let field = UITextField()
        field.placeholder = "Email"
        field.returnKeyType = .next
        field.leftViewMode = .always
        field.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 0))
        field.autocapitalizationType = .none
        field.autocorrectionType = .no
        field.layer.masksToBounds = true
        field.layer.cornerRadius = Constants.cornerRadius
        field.backgroundColor = .secondarySystemBackground
        field.layer.borderWidth = 1.0
        field.layer.borderColor = UIColor.secondaryLabel.cgColor
        return field
    }()
    
    private let usernameField: UITextField = {
        let field = UITextField()
        field.placeholder = "Username"
        field.returnKeyType = .next
        field.leftViewMode = .always
        field.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 0))
        field.autocapitalizationType = .none
        field.autocorrectionType = .no
        field.layer.masksToBounds = true
        field.layer.cornerRadius = Constants.cornerRadius
        field.backgroundColor = .secondarySystemBackground
        field.layer.borderWidth = 1.0
        field.layer.borderColor = UIColor.secondaryLabel.cgColor
        return field
    }()
    
    private let passwordField: UITextField = {
        let field = UITextField()
        field.isSecureTextEntry = true
        field.textContentType = .oneTimeCode
        field.placeholder = "Password"
        field.returnKeyType = .next
        field.leftViewMode = .always
        field.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 0))
        field.autocapitalizationType = .none
        field.autocorrectionType = .no
        field.layer.masksToBounds = true
        field.layer.cornerRadius = Constants.cornerRadius
        field.backgroundColor = .secondarySystemBackground
        field.layer.borderWidth = 1.0
        field.layer.borderColor = UIColor.secondaryLabel.cgColor
        return field
    }()
    
    private let createAccountButton: UIButton = {
        let button = UIButton()
        button.setTitle("Create account", for: .normal)
        button.layer.masksToBounds = true
        button.layer.cornerRadius = Constants.cornerRadius
        button.backgroundColor = .systemRed
        button.setTitleColor(.white, for: .normal)
        return button
    }()
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        createAccountButton.addTarget(self, action: #selector(didTapCreateAccountButton), for: .touchUpInside)
        
        emailField.delegate = self
        usernameField.delegate = self
        passwordField.delegate = self
        
        addSubviews()
        view.backgroundColor = .systemBackground
        // Do any additional setup after loading the view.
    }
    
    private func addSubviews() {
        view.addSubview(emailField)
        view.addSubview(usernameField)
        view.addSubview(passwordField)
        view.addSubview(createAccountButton)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        emailField.frame = CGRect(x: 20, y: view.safeAreaInsets.top   100, width: view.width-40, height: 52)
        usernameField.frame = CGRect(x: 20, y: emailField.bottom   10, width: view.width-40, height: 52)
        passwordField.frame = CGRect(x: 20, y: usernameField.bottom   10, width: view.width-40, height: 52)
        createAccountButton.frame = CGRect(x: 20, y: passwordField.bottom   10, width: view.width-40, height: 52)
    }
    
    @objc private func didTapCreateAccountButton() {
        print("creating account")
        emailField.resignFirstResponder()
        usernameField.resignFirstResponder()
        passwordField.resignFirstResponder()
        
        guard let userEmail = emailField.text, !userEmail.isEmpty, let userUsername = usernameField.text, !userUsername.isEmpty, let userPassword = passwordField.text, !userPassword.isEmpty, userPassword.count >= 8 else {
            return
        }
        
        // check if the email and username are available
        AuthManager.shared.emailUsernameAvailable(email: userEmail, username: userUsername) { areAvailable in
            if areAvailable {
                print("username and email are available")
            } else {
                print("username and email are NOT available")
            }
        }
    }

}

extension SignupViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == emailField {
            usernameField.becomeFirstResponder()
        } else if textField == usernameField {
            passwordField.becomeFirstResponder()
        } else if textField == passwordField {
            didTapCreateAccountButton()
        }
        return true
    }
}
  

И они расположены следующим образом:
новый контроллер просмотра

В симуляторе, когда я нажимаю на текстовое поле пароля, текстовое поле становится желтым и отображает «Надежный пароль», а также скрывает введенный текст:. текст, введенный в поле пароля

Однако я также понял, что если я нажму на текстовое поле пароля перед текстовым полем электронной почты и имени пользователя, текстовое поле будет вести себя так, как ожидалось: текст, введенный в поле пароля раньше других

Я читал другие сообщения, в которых говорилось, что XCode предполагает, что целью вашего просмотра может быть регистрация из имен файлов и имен переменных, что может вызывать ошибку, но я не смог найти исправление для этого конкретного случая. Спасибо!

Ответ №1:

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

Дополнительная метка «пароль», которая покрывает содержимое вашего текстового поля, является ожидаемым поведением из-за опции, которую вы активируете, и называется автозаполнением пароля.

Чтобы полностью активировать эту функцию, вы должны включить связанные с приложением домены.

Если это невозможно, просто установите для textContentType значение .password и установите для isSecureTextEntry значение true .