Swift - Почему я должен использовать viewDidAppear вместо viewWillAppear при перенаправлении пользователя, если пользователь уже вошел в систему - PullRequest
0 голосов
/ 28 сентября 2018

Я делаю клиентское приложение для твиттера, используя TwitterKit.

Начальный 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.

Может кто-нибудь объяснить это мне?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Как следует из названия метода,

viewWillApper означает, что представление текущего viewController будет отображаться, но не в окне.Таким образом, в этом случае вы не можете представить любой viewController поверх viewController, который не отображается в окне.

viewDidApper означает, что представление текущего viewController отображается в окне, поэтомуВы можете представить новый viewController.

PS: Как вы хотите достичь, в случае, если уже вошли в систему, показать список ВК.Я бы предложил настроить rootViewController окна в didFinishLaunchingWithOptions методе AppDelegate.

Как:

    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
}
0 голосов
/ 28 сентября 2018

Я думаю, это потому, что приложение все еще представляет начальный виртуальный канал, и viewWillAppear вызывается перед представлением представления.Поэтому попытка представить другое представление поверх представления, которое еще не представлено, не будет работать.

Мое решение для этого было загрузить Login view со скрытым loginButton, а затем на viewDidAppear проверить, если пользовательвойдите в систему, затем представьте зарегистрированную страницу, в противном случае вы увидите loginButton.

...