Как предварительно выбрать данные из базы данных Firebase, а затем представить представление с этими данными в Textfield - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь предварительно выбрать имя пользователя из базы данных 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 секунды.

1 Ответ

0 голосов
/ 04 июня 2019

Мне кажется, я нашел ответ на свою проблему.Все, что нужно было сделать, - это объявить открытую переменную для всех классов, а затем на домашней странице, где ваше приложение сначала загружается после входа, извлекать данные из базы данных и назначать их общедоступным переменным.

Это решило мою проблему.

В файле контроллера профиля: вне класса:

public var username: String?

внутри класса:

Я переместил функцию getUserData () из AccountInfoController в ProfileController в ProfileController

внутри viewDidLoad ():

getUserData()

Наконец, при инициализации текстового поля я назначил текст в качестве публичной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...