【发布时间】:2018-01-20 17:55:32
【问题描述】:
所以我有一个视图控制器,当用户登录时它会被关闭。在关闭函数完成块中,我触发了一个应该重新加载下一个视图控制器的函数。没有任何反应,空白视图控制器。但是,如果我在已经登录的情况下关闭应用程序,然后重新打开它,一切都会正常加载。
这是我的登录功能:
func loginFunc() {
if emailField.text != "" && passwordField.text != "" {
Auth.auth().signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in
if user != nil {
// Sign In Successful
print("Sign In Sucessful")
self.dismiss(animated: true, completion: {
self.mainVC.starterMethod()
})
} else {
if let myError = error?.localizedDescription {
print(myError)
} else {
print("Error")
}
}
})
}
}
这是我的starterMethod():
func starterMethod() {
ref = Database.database().reference()
let userId = Auth.auth().currentUser?.uid
if userId != nil {
print("You are logged in...")
} else {
present(LoginController(), animated: true, completion: nil)
}
setupPicks()
setupViewsMed()
fetchGames()
setNavigationBar()
setupCircles()
}
starterMethod() 在viewDidLoad 中被调用
如果可能的话,我真的很想避免viewDidAppear()
【问题讨论】:
-
你的
completionBlock@escaping 了吗?如果是,你有内存泄漏(这很糟糕,但它应该可以工作,因为 self 被持久化在内存中并且可以访问mainVC。如果不是@escaping,你肯定会冻结 UI,并且不会有任何内存泄漏,但在关闭完成处理程序后,self 不再存在,因此 mainVC 不应该存在 -
您甚至可以使用通知。委托听起来不错,就像其他人说的那样,但是身份验证比两个 VC 之间的钩子更抽象,用户成功登录后,发送通知,并在 MainVC 中添加观察者
-
@farzadshbfn 如何实现通知和观察者。你能帮我多一点吗? :)
-
我目前无法访问我的电脑,但是这个帖子会给你一个基本的想法......stackoverflow.com/questions/2191594/…
-
@farzadshbfn 太棒了!谢谢