Как открыть один экран, если новый пользователь успешно зарегистрирован, и другой, если существующий пользователь успешно вошел в систему с помощью SwiftUI? - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю на страницах входа и регистрации, используя Firebase Auth по электронной почте и паролю.

Что успешно сделано:

Если сеанс (вход или регистрация) не nil , затем пользователь переходит к представлению Welcome Back.

Вопрос следующий:

Я не хочу, чтобы новый пользователь набрал от go до " Welcome Back " Просмотрите, вместо этого, я хочу его после нажатия кнопки" Зарегистрироваться "(сессия не ноль до go для нового просмотра -" Загрузить просмотр фотографий "

Мой класс хранилища сеансов (@ObservableObject):

 @Published var session: User? {didSet{self.didChange.send(self)}}
 var didChange = PassthroughSubject<SessionStore, Never>()
var handle: AuthStateDidChangeListenerHandle?
let currentuser = Auth.auth().currentUser




func listen(){
    handle = Auth.auth().addStateDidChangeListener({(auth, user) in
        if let user = user{
            self.session = User(uid: user.uid, email: user.email)
        } else {
            self.session = nil
        }

    })
}

func signUp(email: String, password: String, fullname: String, username: String, handler: @escaping AuthDataResultCallback){
    Auth.auth().createUser(withEmail: email, password: password,  completion: handler)


}

func signIn(email: String, password: String, handler: @escaping AuthDataResultCallback){
    Auth.auth().signIn(withEmail: email, password: password){ (res,err) in
        if err != nil{
            return
        }

    }

}

func signOut(){
    do{
        try Auth.auth().signOut()
        self.session = nil
    }catch{
        print("Error signing out")
    }
}

func unbind() {
    if let handle = handle {
        Auth.auth().removeStateDidChangeListener(handle)
    }
}

deinit {
    unbind()
}

func addUsername(username: String){
    session?.username = username
}
func addFullname(fullname: String){
    session?.fullname = fullname
}


class User:ObservableObject{

var uid: String
var email: String?
var username: String?
var fullname: String?

    init(uid:String, email:String?){

    self.uid = uid
    self.email = email

}

}}

Просмотр моего контента выглядит так:

Group {if (session .session! = ноль) {

                Button(action: {
                    try! Auth.auth().signOut()
                    UserDefaults.standard.set(false, forKey: "status")
                    NotificationCenter.default.post(name: NSNotification.Name("statusChange"), object: nil)
                }){
                    Text("Log out")
                }
                ExploreView()

            }else{

                        AuthView()

            }
        }.onAppear(perform: getUser)

1 Ответ

0 голосов
/ 18 апреля 2020

Возможным решением было бы двустороннее связывание, которое просто срабатывает, если регистрация прошла успешно (поэтому это первый вход в систему в этот момент).

Отредактируйте свой комментарий: В signUp-fun c вы устанавливаете переменную в "true", когда signUp был успешным, и PhotoUploadView появится.

Добавьте переменную в классе User (который затем можно использовать в сеансе переменных):

    @Published var firstLogin = false

Изменить firstLogin после успешной регистрации в signUp-fun c:

session.firstLogin = true

Использовать что-то подобное в ContentView:

//.....
else{
if session.firstLogin {
         PhotoUploadView()
        }

После этого установите для session.firstLogin значение false, когда вы это сделаете в PhotoUploadView.

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