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

Swift&OSX开发:两个NSViewController切换及Token保存方法咨询

嗨,完全理解作为Swift和macOS开发新手的困惑,别担心基础问题——我们都是从这个阶段过来的!针对你的需求,我会一步步拆解怎么实现登录后的页面跳转,同时把Token传递给新页面并持久化保存,而且这些操作完全可以在按钮点击的函数里完成。

核心实现步骤

1. 给登录按钮绑定点击事件

首先在你的ViewController.swift里,给登录按钮添加一个IBAction方法(可以通过Storyboard拖线,或者代码手动绑定):

import Cocoa

class ViewController: NSViewController {
    // 假设你已经通过Storyboard关联了输入框
    @IBOutlet weak var usernameField: NSTextField!
    @IBOutlet weak var passwordField: NSSecureTextField!

    @IBAction func loginButtonTapped(_ sender: NSButton) {
        // 这里是登录逻辑的核心入口
        let username = usernameField.stringValue
        let password = passwordField.stringValue

        // 模拟调用登录接口获取Token(替换成你实际的网络请求逻辑)
        fetchToken(username: username, password: password) { [weak self] token in
            guard let self = self, let token = token else {
                // 处理登录失败的情况,比如弹出提示框
                let alert = NSAlert()
                alert.messageText = "登录失败"
                alert.informativeText = "请检查账号密码是否正确"
                alert.runModal()
                return
            }

            // 登录成功,执行页面跳转和Token保存
            self.handleLoginSuccess(with: token)
        }
    }

    // 模拟登录接口
    private func fetchToken(username: String, password: String, completion: @escaping (String?) -> Void) {
        // 这里替换成你的实际网络请求代码
        if username == "test" && password == "123456" {
            completion("your_valid_auth_token")
        } else {
            completion(nil)
        }
    }

    // 处理登录成功后的逻辑
    private func handleLoginSuccess(with token: String) {
        // 方式一:通过Storyboard Segue跳转(适合用Storyboard构建界面的场景)
        self.performSegue(withIdentifier: "LoginToSecondSegue", sender: token)

        // 方式二:纯代码实例化并跳转(适合纯代码构建界面的场景)
        // let secondVC = SecondViewController()
        // secondVC.userToken = token
        // // 保存Token到UserDefaults(后续全局可用)
        // UserDefaults.standard.set(token, forKey: "UserAuthToken")
        // // 跳转页面(根据窗口结构选择合适的方式)
        // self.presentAsSheet(secondVC)
        // // 或者替换窗口的根ViewController
        // // self.view.window?.contentViewController = secondVC
    }

    // 重写Segue准备方法,传递Token给目标页面
    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        if segue.identifier == "LoginToSecondSegue", 
           let token = sender as? String,
           let secondVC = segue.destinationController as? SecondViewController {
            // 直接传递Token给SecondViewController
            secondVC.userToken = token
            // 同时把Token持久化到UserDefaults,方便后续其他页面使用
            UserDefaults.standard.set(token, forKey: "UserAuthToken")
        }
    }
}

2. 配置SecondViewController接收Token

在SecondViewController.swift里,定义一个属性来接收传递过来的Token:

import Cocoa

class SecondViewController: NSViewController {
    // 用于接收登录页面传递的Token
    var userToken: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 在这里可以使用Token做后续操作,比如请求用户信息
        if let token = userToken {
            print("当前用户Token:\(token)")
            // 或者从UserDefaults读取(如果之前存了的话)
            // let savedToken = UserDefaults.standard.string(forKey: "UserAuthToken")
        }
    }
}

3. 关于Token的安全存储

上面例子里用了UserDefaults来保存Token,这适合快速原型开发,但生产环境下建议用Keychain存储敏感信息(比如Token),因为UserDefaults里的内容是明文存储的,不安全。如果你需要Keychain的实现方式,可以随时问我~

额外提示
  • 如果用Storyboard的方式跳转,记得在Storyboard里给Segue设置正确的identifier(就是代码里的LoginToSecondSegue),可以通过选中Segue后在右侧属性面板里设置。
  • 跳转方式可以根据需求选择:presentAsSheet是弹窗式跳转,替换contentViewController是替换整个窗口的根页面,你可以根据UI设计来选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:26:47