Swift 4: навигационный контроллер нежелательного зацикливания - PullRequest
2 голосов
/ 21 января 2020

У меня есть следующий код:

import UIKit
import FacebookLogin

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if AccessToken.current != nil {
            // Already logged-in
            // Redirect to Home View Controller
            goToHome()
        }

        // Add LoginButton
        let loginButton = FBLoginButton(permissions: [ .publicProfile, .email, .userFriends ])
        let screenSize:CGRect = UIScreen.main.bounds
        let screenHeight = screenSize.height // real screen height
        //let's suppose we want to have 10 points bottom margin
        let newCenterY = screenHeight - loginButton.frame.height - 20
        let newCenter = CGPoint(x: view.center.x, y: newCenterY)
        loginButton.center = newCenter
        view.addSubview(loginButton)

        // Triggered after every successfully login / logout
        NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
            if AccessToken.current != nil {
                // Successfully just Logged in
                // Redirect to Home View Controller
                self?.goToHome()
            } else {
                // Successfully just Logged out
            }
        }
    }

    func goToHome() {
        let storyboard = UIStoryboard(name: "HomeAfterLogIn", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "HomeAfterLogInViewController") // I called mine like that (check screenshot below)
        self.navigationController?.pushViewController(vc, animated: true)
    }

}

Этот код позволяет пользователю войти в мое приложение с помощью SDK Facebook. LaunchScreen.storyboard выглядит следующим образом:

enter image description here

, что затем приводит к Main.storyboard, который выглядит следующим образом:

enter image description here

Если вход в систему пользователя успешен, они будут перенаправлены на HomeAfterLogIn.storyboard, как показано ниже:

enter image description here

Однако эта страница непрерывно загружается после того, как пользователь вошел в систему, то есть пользователь успешно вошел в систему, отображается метка «Вход в систему», а затем она перезагружается снова и снова, тогда как я просто хочу, чтобы она загружалась один раз. , Если пользователь ранее вошел в систему, страница загружается только один раз, как показано ниже:

if AccessToken.current != nil {
            // Already logged-in
            // Redirect to Home View Controller
            goToHome()
        }

Но если пользователь новый пользователь / первый раз, он будет зацикливаться, поэтому я думаю, что ошибка здесь:

// Triggered after every successfully login / logout
        NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
            if AccessToken.current != nil {
                // Successfully just Logged in
                // Redirect to Home View Controller
                self?.goToHome()
            } else {
                // Successfully just Logged out
            }
        }

Ответы [ 2 ]

1 голос
/ 21 января 2020

Я вижу из вашего последнего скриншота, что для вашего HomeAfterLogInViewController в storyboard вы установили атрибут класса *1003* Пользовательского класса ViewController, что означает, что вы связываете этот пользовательский интерфейс HomeAfterLogInViewController с ViewController.swift и кажется, что вы все oop.

Каждый пользовательский интерфейс раскадровки ViewController должен быть связан с быстрым классом, представляющим определенные c ViewController logi c.

Это означает, что на последнем скриншоте, где вы видите справа Custom Class, замените ViewController на HomeAfterLogInViewController (это должно быть то же имя файла, что и у вас HomeAfterLogInViewController.swift)

enter image description here

1 голос
/ 21 января 2020

Привет, вот еще один похожий код, который, надеюсь, поможет решить вопрос. Конечно, я использую Firebase в качестве своей аутентификации, поэтому возможно, что структура отличается.

Вы говорите, что один и тот же экран продолжает появляться? Даже после того, как вы нажмете на следующую V C? Возможно, на раскадровке вы что-то испортили, но дайте мне знать, если у вас есть более подробная информация об этом. Надеюсь, это поможет! Удачи!

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