Я пытаюсь предварительно выбрать имя пользователя из базы данных Firebase, а затем показать его в текстовом поле, когда представление отображается без задержки.Проблема в том, что я не могу выполнить предварительную выборку данных из базы данных до представления представления.
Я попытался создать оператор if внутри единого представления наблюдения, который говорит, что если self.username! = Nil, то настроить представление (Перемещенное представление загрузило функции настройки представления внутри этого оператора if).Это почти сделало то, что я хотел, но оно показало анимацию загрузки представления и подождало пару секунд, пока не загрузилось текстовое поле с данными.Попытка устранить задержку и заставить ее мгновенно загрузиться с представлением.
Также попытался добавить func setData {userTextField.text = username} и вызвать его в getData в наблюдении, все еще задержка 2 секунды.
Примечание: файл ProfileController self.present Файл AccountInfoController
Файл расширения:
extension UIView {
func labelTextContainerView(view: UIView, label: UILabel,_ textField: UITextField) -> UIView {
view.backgroundColor = .white
view.addSubview(label)
label.font = UIFont.systemFont(ofSize: 10)
label.textColor = UIColor.mainBlue()
label.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: nil, right: nil, paddingTop: 10, paddingLeft: 20, paddingBottom: 0, paddingRight: 0, width: 0, height: 9)
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
if (textField.text?.isEmpty ?? true) {
label.isHidden = true
}
view.addSubview(textField)
//textField.textColor = .black
textField.anchor(top: label.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 20, width: 0, height: 0)
textField.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
let separatorView = UIView()
separatorView.backgroundColor = UIColor(white: 0.87, alpha: 1)
view.addSubview(separatorView)
separatorView.anchor(top: nil, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 0, width: 0, height: 0.75)
return view
}
}
extension UITextField {
func editableTextField(withPlaceolder placeholder: String, someText: String?, enableEditing: Bool) -> UITextField {
let tf = UITextField()
tf.borderStyle = .none
tf.font = UIFont.systemFont(ofSize: 16)
if (enableEditing == false) {
tf.isEnabled = enableEditing
tf.isUserInteractionEnabled = enableEditing
tf.alpha = 0.5
}
tf.text = someText
tf.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [NSAttributedString.Key.foregroundColor: UIColor(white: 0.8, alpha: 1)])
return tf
}
}
AccountInfoController ФАЙЛ:
import UIKit
import Firebase
class AccountInfoController: UIViewController {
//MARK: - Properties
var ref = Database.database().reference()
var userID = Auth.auth().currentUser?.uid
var username: String?
var userLabel = UILabel()
lazy var userContainerView: UIView = {
let view = UIView()
return view.labelTextContainerView(view: view, label: userLabel, userTextField)
}()
lazy var userTextField: UITextField = {
userLabel.text = "Username"
userLabel.isHidden = false
let tf = UITextField()
return tf.editableTextField(withPlaceolder: "Username", someText: self.username?.lowercased(), enableEditing: false)
}()
//MARK: - Init
override func viewDidLoad() {
super.viewDidLoad()
getUserData()
//print(self.username)
configureViewComponents()
configureViewLabel()
}
func getUserData() {
user.child("username").observeSingleEvent(of: .value) { (snapshot) in
guard let userName = snapshot.value as? String else { return }
print(userName)
self.username = userName
}
}
// MARK: - Helper Functions
func configureViewLabel() {
//some code
}
func configureViewComponents() {
//some code
view.addSubview(userContainerView)
userContainerView.anchor(top: emailContainerView.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 60)
//some code
}
}
Ожидание: при представлении AccountInfoController требуется текстовое полечтобы иметь имя пользователя текущего пользователя, не дожидаясь, пока база данных извлечет данные, Я ожидаю, что база данных предварительно выберет имя пользователя.
Текущие результаты: приведенный выше код даже не показываетимя пользователя в текстовом поле после того, как база данных его выберет.если не добавлено упомянутое выше выражение if, то задержка составляет 2 секунды.