Swift - 如果用户已经登录,为什么在重定向用户时我应该使用 viewDidAppear 而不是 viewWillAppear
Swift - Why should I use viewDidAppear rather than viewWillAppear when redirect user if the user logged in already
我正在使用 TwitterKit 制作 Twitter 客户端应用程序。
最初的VC是带有登录按钮的登录VC。登录后,它会显示显示推文列表的表格视图VC。
如果用户之前已经登录并且会话仍然存在,我想将用户直接重定向到 tableviewVC。
所以我在 viewWillAppear 中实现了检查登录用户并显示 tableviewVC 的代码,但是 tableviewVC 从未显示过,尽管用户会话仍然存在。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if TWTRTwitter.sharedInstance().sessionStore.hasLoggedInUsers() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tweetVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
present(tweetVC, animated: true, completion: nil)
}
}
但是当我在 viewDidAppear 中实现相同的代码时,tableviewVC 在用户会话保持时出现。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if TWTRTwitter.sharedInstance().sessionStore.hasLoggedInUsers() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tweetVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
present(tweetVC, animated: true, completion: nil)
}
}
我不明白为什么当代码在 viewWillAppear 中时它不起作用。
有人可以为我解释一下吗?
我认为这是因为它是应用程序仍在呈现的初始VC,并且在呈现视图之前调用了viewWillAppear
。因此,尝试在尚未呈现的视图之上呈现另一个视图是行不通的。
我的解决方案是加载 Login view
并隐藏 loginButton
然后在 viewDidAppear
检查用户是否登录然后显示登录页面否则你显示 loginButton
.
正如方法名称所解释的那样,
viewWillApper
表示当前 viewController 的视图将出现,仍然不在 window 上。因此,在那种情况下,您不能在 viewController 上显示任何 viewController,而 window.
中未显示
viewDidApper
表示当前 viewController 的视图显示在 window 上,这就是为什么您可以显示新的 viewController。
PS:
如您所愿,如果已经登录,请显示 listVC。我建议在 AppDelegate
.
的 didFinishLaunchingWithOptions
方法中设置 window 的 rootViewController
赞:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
var rootVC: UIViewController?
if <check weather user is already logged in> {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
rootVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
}
else {
rootVC = <you loginVC object>
}
self.window?.rootViewController = rootVC
self.window?.makeKeyAndVisible()
return true
}
我正在使用 TwitterKit 制作 Twitter 客户端应用程序。
最初的VC是带有登录按钮的登录VC。登录后,它会显示显示推文列表的表格视图VC。
如果用户之前已经登录并且会话仍然存在,我想将用户直接重定向到 tableviewVC。
所以我在 viewWillAppear 中实现了检查登录用户并显示 tableviewVC 的代码,但是 tableviewVC 从未显示过,尽管用户会话仍然存在。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if TWTRTwitter.sharedInstance().sessionStore.hasLoggedInUsers() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tweetVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
present(tweetVC, animated: true, completion: nil)
}
}
但是当我在 viewDidAppear 中实现相同的代码时,tableviewVC 在用户会话保持时出现。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if TWTRTwitter.sharedInstance().sessionStore.hasLoggedInUsers() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tweetVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
present(tweetVC, animated: true, completion: nil)
}
}
我不明白为什么当代码在 viewWillAppear 中时它不起作用。
有人可以为我解释一下吗?
我认为这是因为它是应用程序仍在呈现的初始VC,并且在呈现视图之前调用了viewWillAppear
。因此,尝试在尚未呈现的视图之上呈现另一个视图是行不通的。
我的解决方案是加载 Login view
并隐藏 loginButton
然后在 viewDidAppear
检查用户是否登录然后显示登录页面否则你显示 loginButton
.
正如方法名称所解释的那样,
viewWillApper
表示当前 viewController 的视图将出现,仍然不在 window 上。因此,在那种情况下,您不能在 viewController 上显示任何 viewController,而 window.
viewDidApper
表示当前 viewController 的视图显示在 window 上,这就是为什么您可以显示新的 viewController。
PS:
如您所愿,如果已经登录,请显示 listVC。我建议在 AppDelegate
.
didFinishLaunchingWithOptions
方法中设置 window 的 rootViewController
赞:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
var rootVC: UIViewController?
if <check weather user is already logged in> {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
rootVC = storyboard.instantiateViewController(withIdentifier: "TweetTableViewController")
}
else {
rootVC = <you loginVC object>
}
self.window?.rootViewController = rootVC
self.window?.makeKeyAndVisible()
return true
}