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

Swift中如何通过Prepare for Segue传递登录用户名变量

解决Navigation Controller中传递动态用户名到MainViewController的问题

看起来你已经搞定了静态文本的传递,现在只需要把硬编码的字符串换成实际的登录用户名变量就行,我给你一步步拆解解决方案:

1. 先在LoginPage中存储登录获取到的用户名

首先你需要从Facebook登录的回调里拿到用户的真实名字,并存到一个变量里。先在LoginPage类里声明一个用来存储用户名的变量:

var currentUserName: String = ""

然后完善你的Facebook登录方法,在登录成功后请求用户信息并把名字赋值给这个变量:

// LOGIN with FACEBOOK
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error?) {
    guard error == nil else {
        print("登录错误:\(error!)")
        return
    }
    
    // 请求Facebook用户信息,获取用户名
    FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "name"]).start { (connection, result, requestError) in
        guard requestError == nil else {
            print("获取用户信息失败:\(requestError!)")
            return
        }
        
        // 解析出用户名并存储到变量中
        if let userDict = result as? [String: Any], let userName = userDict["name"] as? String {
            self.currentUserName = userName
            // 登录成功后再触发segue跳转,确保用户名已经获取到
            self.performSegue(withIdentifier: "OpenPVOapp", sender: self)
        }
    }
}

2. 修改prepare方法,传递动态变量

把你原来硬编码的"Arthur Dent"换成刚才存储的currentUserName变量,另外要注意如果你的segue目标是NavigationController,得先拿到它的顶层ViewController(这是很多人容易踩的坑):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "OpenPVOapp" {
        // 处理两种跳转情况:直接到MainVC,或者到包裹MainVC的NavigationController
        if let navController = segue.destination as? UINavigationController {
            guard let mainVC = navController.topViewController as? MainViewController else {
                print("类型转换失败:无法获取MainViewController")
                return
            }
            mainVC.userName = self.currentUserName
        } else {
            guard let mainVC = segue.destination as? MainViewController else {
                print("类型转换失败:无法获取MainViewController")
                return
            }
            mainVC.userName = self.currentUserName
        }
    }
}

3. 在MainViewController中显示用户名

确保你的MainViewController有对应的接收属性和标签IBOutlet,然后在视图加载时把变量值赋值给标签:

class MainViewController: UIViewController {
    // 假设你已经在Storyboard里给显示用户名的标签关联了IBOutlet
    @IBOutlet weak var userNameLabel: UILabel!
    // 接收从LoginPage传递过来的用户名
    var userName: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 把动态获取的用户名显示到标签上
        userNameLabel.text = userName
    }
}

额外注意点

  • 确认你的Facebook登录按钮已经设置了readPermissions = ["public_profile"],这样才能获取到用户的name字段。
  • 检查Storyboard里的segue标识符确实是"OpenPVOapp",和代码里的完全一致。
  • 如果原来的segue是直接绑定在登录按钮上的,记得去掉这个绑定,改成在登录成功后用代码调用performSegue,这样才能保证先拿到用户名再跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:15:31