【问题标题】:Swift 4: Navigation Controller unwanted loopingSwift 4:导航控制器不需要的循环
【发布时间】:2020-05-07 00:32:30
【问题描述】:

我有以下代码:

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,如下所示:

但是,一旦用户登录,即用户成功登录,则此页面会持续加载,显示“登录”标签,然后它会一遍又一遍地重新加载,而我只希望它加载一次。如果用户之前登录过,页面只加载一次,代码如下:

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

【问题讨论】:

    标签: ios swift xcode facebook sdk


    【解决方案1】:

    我可以从您的上一个屏幕截图中看到,对于 storyboard 中的 HomeAfterLogInViewController,您已将 Custom Class class 属性设置为 ViewController,这意味着您将 HomeAfterLogInViewController 的 UI 与 @ 链接987654325@,看来你陷入了循环。

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

    这意味着在您的上一个屏幕截图中,您在右侧看到自定义类将 ViewController 替换为 HomeAfterLogInViewController(它应该与您拥有的文件名称与 HomeAfterLogInViewController.swift 相同) p>

    【讨论】:

    • 问题已解决!该应用程序现在运行良好!非常感谢!
    【解决方案2】:

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

        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 之后?故事板上的某些内容可能会搞砸,但如果您对此有更多详细信息,请告诉我。希望这会有所帮助!祝你好运!

    【讨论】:

    • 是的,太棒了——没问题! :)
    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多