0

我正在使用 TwitterKit 制作 Twitter 客户端应用程序。

初始 VC 是带有登录按钮的 loginVC。登录后,它会显示显示推文列表的 tableviewVC。

如果用户之前已经登录并且会话仍然存在,我想直接将用户重定向到 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 中时它不起作用。

有人可以为我解释一下吗?

4

2 回答 2

1

正如方法名称所解释的,

viewWillApper表示当前 viewController 的视图将出现,但仍不在窗口上。因此,在这种情况下,您不能在未显示在窗口中的 viewController 上显示任何 viewController。

viewDidApper表示当前 viewController 的视图正在窗口上显示,这就是您能够呈现新 viewController 的原因。

PS: 如你所愿,在已经登录的情况下显示listVC。我建议在方法中设置rootViewController窗口的.didFinishLaunchingWithOptionsAppDelegate

像:

    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
}
于 2018-09-28T15:26:55.423 回答
0

我认为这是因为它是应用程序仍在呈现的初始 VC,并且在呈现viewWillAppear视图之前被调用。因此,试图在尚未呈现的视图上呈现另一个视图是行不通的。

Login view我对此的解决方案是加载loginButton隐藏然后viewDidAppear检查用户是否已登录然后显示记录的页面,否则显示loginButton.

于 2018-09-28T15:25:57.017 回答