Состояние ViewDidLoad не обновляется после выхода из системы и входа в систему - PullRequest
0 голосов
/ 29 сентября 2019

Таким образом, мой контроллер вида, а именно «HomeViewController», в основном отображает метку и две кнопки, connect и logout .

После просмотразагружен, мой ярлык в основном имеет цвет фона белый и текст, который говорит "Нажмите кнопку подключения" . Когда я нажимаю кнопку connect , метка меняет текст на «Пожалуйста, подождите, ожидайте соединения с кем-то» , а цвет фона меняется на желтый . Затем я выполняю некоторые запросы Firebase и связываю пользователя с кем-то. После подключения я меняю цвет метки на зеленый и текст на «Вы уже подключены» .

Все работает просто отлично, за исключением того, что у меня есть две проблемы:

  1. Когда загружается представление, я вызываю функцию fetchUserDet(), которая выбирает данные пользователя и сохраняет их в объявленном объекте User. Я использую этот объект User для доступа к сведениям о текущем вошедшем в систему пользователе, таких как имя, возраст и т. Д. Однако, когда я выхожу из системы и захожу как другой пользователь, объекту User просто не удается получить сведения о недавно зарегистрированном пользователе. in user и возвращает nil.

    Временное исправление: я снова вызываю функцию fetchUserDet() в функции viewWillAppear(), но я полагаю, что это плохая практика, но она выполняет свою работу. Теперь мой User объект назначен вновь вошедшему в систему пользователю

  2. Скажем, я нажимаю кнопку подключения, метка меняет цвет и текст, как и ожидалось, но когда я выхожу из системы и захожукак другой пользователь, метка и текст остаются в том же состоянии, что и для предыдущего пользователя. Пример: Вы вошли как пользователь 1 и нажмите кнопку connect , ярлык меняет цвет на желтый и текст на "Пожалуйста, подождите, ожидайте соединения с вамикто-то ". Когда я выхожу и регистрируюсь как пользователь 2 , он остается в том же состоянии, что и желтый и «Пожалуйста, подождите, ожидая соединения с кем-то» *

Я предполагаю, что обе эти ошибки взаимосвязаны, и я определенно делаю что-то здесь не так. Я использую Firestore . Вот код для вашего понимания.

import Firebase
import FirebaseFirestore
import ProgressHUD

class HomeController: UIViewController {

    // MARK: Initialize

    override func viewWillAppear(_ animated: Bool) {
        fetchUserDet()
    }

    var currentUser: User!
    var connected: Bool? {
        didSet{
            print("Step 7 - Connection has been established at didset")
            self.connectionLabel.backgroundColor = .green
            self.connectionLabel.text = "You are now connected. Start texting"
        }
    }

    let connectionLabel: UILabel = {
       let label = UILabel()
        label.text = "Press the connect button for a new connection"
        label.textColor = .white
        label.backgroundColor = .black
        label.textAlignment = .center
        return label
    }()

    let signoutButton: UIButton = {
       let button = UIButton()
        button.setTitle("Logout", for: .normal)
        button.backgroundColor = .red
        button.addTarget(self, action: #selector(handleSignout), for: .touchUpInside)
        return button
    }()

    let connectButton: UIButton = {
       let button = UIButton()
        button.setTitle("Connect", for: .normal)
        button.setTitleColor(.red, for: .normal)
        button.backgroundColor = .white
        button.addTarget(self, action: #selector(handleConnect), for: .touchUpInside)
        return button
    }()

    // MARK: View Did Load

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchUserDet()
    }

    // MARK: Signout

    @objc func handleSignout(){
        do {
            try Auth.auth().signOut()
            let navController = UINavigationController(rootViewController: LoginController())
            navController.modalPresentationStyle = .fullScreen
            self.present(navController, animated: true, completion: nil)
        } catch let error {
            print("Failed to signout", error.localizedDescription)
        }
    }

    // MARK: Connection Handle

    @objc func handleConnect(){
        self.connectionLabel.text = "Please wait, finding you a match..."
        self.connectionLabel.textColor = .black
        self.connectionLabel.backgroundColor = .yellow

        self.connectButton.isEnabled = false
        self.connectButton.backgroundColor = .black
        Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(handleTime), userInfo: nil, repeats: false)

        guard let cUid = Auth.auth().currentUser?.uid else {return}
        let gender = currentUser.gender!

        //Connection Operation : This function does the connection work
        connections(gender: gender, cUid: cUid)
    }

    // MARK: Connection Algorithm

       connections(gender: String. cUid: String) {
         //Perform the database connections and algorithm
         //If connection is established, I set the isConnected variable to true
         self.connected = true
    }

    @objc func handleTime() {
        self.connectButton.isEnabled = true
        self.connectButton.backgroundColor = .white
    }

    // MARK: Authenticate / Views

    fileprivate func fetchUserDet(){
        if Auth.auth().currentUser == nil {
            DispatchQueue.main.async {
                let navController = UINavigationController(rootViewController: LoginController())
                navController.modalPresentationStyle = .fullScreen
                self.present(navController, animated: true, completion: nil)
            }
        } else {
            configureViewComponents()
            configureUserDetails()
        }
    }

    // MARK: Configure Components

    func configureViewComponents(){
        view.backgroundColor = .black

        let stackView = UIStackView(arrangedSubviews: [connectionLabel, signoutButton, 
          connectButton])
        stackView.distribution = .fillEqually
        stackView.axis = .vertical
        view.addSubview(stackView)
        stackView.anchor(top: view.topAnchor, leading: view.leadingAnchor, bottom: 
           view.bottomAnchor, trailing: view.trailingAnchor, padding: .init(top: 20, left: 0, 
           bottom: 20, right: 0))
    }

    // MARK: Configure User Details

    func configureUserDetails(){
        guard let cUid = Auth.auth().currentUser?.uid else {return}

        Firestore.firestore().collection("users").document(cUid).getDocument { (snapshot, error) 
           in
            if let error = error {
                print("There was an error fetching the current user details ", error.localizedDescription)
                return
            }

            let dictionary = snapshot?.data()
            self.currentUser = User(dictionary: (dictionary)!)
            print(self.currentUser!)
            print("Step 1 Gender")
            print(self.currentUser.gender!)
        }
    }
}

1 Ответ

0 голосов
/ 29 сентября 2019

Я предполагаю, что вы должны научиться использовать push / pop и present / dismiss, а также когда и что использовать, чтобы уберечь себя от проблем с навигацией, например, ваш метод handleSignOut должен вызывать / отклонять текущий HomeViewController, чтобы добраться допредыдущий вид контроллера входа в систему.

@objc func handleSignout(){
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...