You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Facebook登录成功后调用PerformSegue报错:无对应segue标识符

问题分析与解决方案

问题根源

你遇到的错误核心原因是:

  • UserLoginManager虽然继承了UIViewController,但你在ViewController中创建的fbmanager = UserLoginManager()是一个未关联到storyboard、未加入视图层级的独立实例,它根本没有配置名为gonext的segue。
  • 调用loginManager.logIn时传入了viewController: nil,没有指定当前显示的视图控制器,同时错误地让非视图层级的UserLoginManager执行segue跳转。

修复方案

1. 重构UserLoginManager,剥离视图控制器职责

登录管理类不需要继承UIViewController,它的职责应该是处理登录逻辑,通过闭包回调通知登录结果,由当前显示的视图控制器处理跳转。

修改后的UserLoginManager代码:

import Foundation
import FacebookLogin

class UserLoginManager {
    private let loginManager = LoginManager()
    
    func facebookLogin(from viewController: UIViewController, completion: @escaping (Bool) -> Void) {
        loginManager.logIn(permissions: [.publicProfile, .email], viewController: viewController) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
                completion(false)
            case .cancelled:
                print("User cancelled login.")
                completion(false)
            case .success(let grantedPermissions, let declinedPermissions, let accessToken):
                print("Logged in! \(grantedPermissions) \(declinedPermissions) \(accessToken)")
                GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name"]).start(completionHandler: { (connection, result, error) -> Void in
                    if error == nil {
                        let fbDetails = result as! NSDictionary
                        print(fbDetails)
                    }
                })
                completion(true)
            }
        }
    }
}

2. 修改ViewController,由当前VC处理跳转

让ViewController接收登录成功的回调,在主线程执行segue跳转(因为Facebook登录回调可能在后台线程)。

修改后的ViewController代码:

import UIKit
import FacebookLogin

class ViewController: UIViewController {
    
    var fbmanager = UserLoginManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func facebook(_ sender: UIButton) {
        fbmanager.facebookLogin(from: self) { [weak self] success in
            guard let self = self else { return }
            if success {
                DispatchQueue.main.async {
                    self.performSegue(withIdentifier: "gonext", sender: self)
                }
            }
        }
    }
}

3. 验证Storyboard配置

最后确认Storyboard的segue设置:

  • 确保ViewController(登录按钮所在的VC)和目标跳转VC之间已创建segue
  • 检查segue的Identifier确实为gonext(注意大小写和拼写)
  • 确认segue的触发方式是"Show"或你需要的跳转类型

内容的提问来源于stack exchange,提问作者Mykyta Yarovoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:48:25