Перенаправить пользователя на определенную страницу после входа - PullRequest
0 голосов
/ 28 мая 2019

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

Часть 1: Часть 1 (Дочерняя база данных (это работает) и настройка пользователя по умолчанию (я не знаю, как проверить, что это сработало)

Часть 2: в другом файле .Swift (Проверьте, существует ли пользовательское значение по умолчанию (aka Education Child). У меня почти ничего нет, кроме того, я знаю, что оно должно войти в viewDidAppear

Часть 1

@IBAction func SubmitPressed(_ sender: Any) {             
let databaseRef = Database.database().reference()             
let uid = Auth.auth().currentUser!.uid
databaseRef.child("Education").child(uid).setValue(self.Education.text!)             
UserDefaults.standard.set("Education", forKey: "Education") 

часть 2 func viewDidAppear (_ animated: String) {
?????? }

Нет ошибки для части 1, хотя и не уверен, что она создала пользовательские настройки по умолчанию. Для части 2 я перепробовал кучу вещей, но не сработал.

Вот обновленный код после первого ответа:

import Foundation
import UIKit
import SwiftKeychainWrapper
import Firebase
import CoreFoundation
import AVFoundation
import FirebaseDatabase


var educationCache : String {
    get {
        return (UserDefaults.standard.string(forKey: "Education")!)
    } set {
        UserDefaults.standard.set(newValue, forKey: "Education")
    }
}

соответствующая часть образования / личная информация введите страницу

@IBAction func SubmitPressed(_ sender: Any) {

    let databaseRef = Database.database().reference()
    let uid = Auth.auth().currentUser!.uid
    databaseRef.child("Education").child(uid).setValue(self.Education.text!)
    // The following line will save it in userDefault itself. And you dont have to call the whole UserDefault Everywhere
    educationCache = "Education"

    self.performSegue(withIdentifier: "tohome", sender: nil)
         }

Домашняя страница

import Foundation
import UIKit
import SwiftKeychainWrapper
import Firebase
import CoreFoundation
import AVFoundation
import FirebaseDatabase




class homepage:UITableViewController {

override func viewDidAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if educationCache.count < 0 {
        self.performSegue(withIdentifier: "toFeed", sender: nil)
    }

    }

 override func viewDidLoad() {



  navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Sign Out", style: .plain, target: self, action: #selector(signOut))
   super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}




@objc func signOut (_sender: AnyObject) {


    KeychainWrapper.standard.removeObject(forKey: "uid")
    do {
        try Auth.auth().signOut()
    } catch let signOutError as NSError {
        print ("Error signing out: %@", signOutError)
    }

    dismiss(animated: true, completion: nil)

     }

 }

1 Ответ

0 голосов
/ 28 мая 2019

Вы не хотите проверять условие - это viewController, где вы выполняете определенные действия.Также проверка userDefaults каждый раз просто помещает дополнительные представления в иерархию.Firebase предоставляет функцию .addStateDidChangeListener для проверки.Добавьте следующий код к вашему делегату.Он будет автоматически переключаться между пользователями, если они есть или нет.

AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()
        observeUser()
        return true
    }

    func observeUser(){
        Auth.auth().addStateDidChangeListener { (auth, user) in
            if (user != nil) {
                // If the user is not nil. Perform this block
                self.showInitController(with identifier: "<add_your_storyboard_reusableID_for_homepage>", animated: false)
                // The storyboard Id belongs to the HOMEPAGE/FEED, the view where user goes on signIn
            } else {
                //If there is no user. This block will perform
                self.showInitController(with identifier: "<add_your_storyboard_reusableID_for_loginpage>", animated: false)
                // The storyboard Id belongs to the SIGNUP PAGE, the view where user goes on signIn
            }
        }
    }

   func showInitController(with identifier: String, animated: Bool = false) {
        DispatchQueue.main.async {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: identifier)
            var topRootViewController: UIViewController = (UIApplication.shared.keyWindow?.rootViewController)!
            while((topRootViewController.presentedViewController) != nil){
                topRootViewController = topRootViewController.presentedViewController!
            }
            topRootViewController.present(vc, animated: animated, completion: nil)
        }
    }

В вашем файле swift один.сделайте следующее и никогда не оглядывайтесь назад.Вы можете автоматически перенаправить просмотр, если вы применили другие функции.

@IBAction func SubmitPressed(_ sender: Any) {
        let databaseRef = Database.database().reference()
        let uid = Auth.auth().currentUser!.uid
        databaseRef.child("Education").child(uid).setValue(self.Education.text!)
        self.performSegue(withIdentifier: "tohome", sender: nil)
    }

Во втором представлении не надо ничего делать где-либо.Просто оставьте это, если ничего в этом представлении не требуется снова.

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