#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 .