Swift 4:导航控制器不需要的循环

Swift 4: Navigation Controller unwanted looping

我有以下代码:

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)
    }

}

此代码允许用户使用 Facebook SDK 登录我的应用程序。 LaunchScreen.storyboard如下:

然后导致 Main.storyboard,它看起来像这样:

如果用户登录成功,他们将被带到HomeAfterLogIn.storyboard,如下所示:

但是,一旦用户登录,此页面就会持续加载,即用户成功登录,显示 "Logged In" 标签,然后一遍又一遍地重新加载,而我只是想让它加载一次。如果用户之前登录过,页面只会加载一次,即下面的代码:

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
            }
        }

嘿,这里有一些类似的代码,希望对您有所帮助:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let signedIn = UserDefaults.standard.bool(forKey: "signedIn")

    if(signedIn) {
        let HomeVC2 = storyboard.instantiateViewController(withIdentifier: "HomeTabBarController")
        self.window?.rootViewController = HomeVC2
    } else {
        let signInVC = storyboard.instantiateViewController(withIdentifier: "EntryVC")
        self.window?.rootViewController = signInVC
    }

    return true
}

我看到你有一些几乎相同的东西,但看起来在这个结构中添加 "if" "else" "return" 可能会解决问题。当然,我使用 Firebase 作为我的身份验证,所以结构可能不同。

你是说一直弹出同一个画面?即使在您点击进入下一个 VC 之后?故事板上的某些内容可能会把它搞砸,但如果您有更多详细信息,请告诉我。希望这有帮助!祝你好运!

我可以从你最后的截图中看到,你在 storyboard 中为 HomeAfterLogInViewController 设置了 Custom Class class 属性到 ViewController 这意味着您正在将 HomeAfterLogInViewController 的 UI 与 ViewController.swift 链接起来,看起来您处于循环中。

每个故事板 UI ViewController 必须链接到一个 swift class 代表特定的 ViewController 逻辑。

这意味着在您最后的屏幕截图中,您在右侧看到的 Custom Class 将 ViewController 替换为 HomeAfterLogInViewController(应该是与 HomeAfterLogInViewController.swift)

相同的文件名