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
相关产品推荐
相关产品推荐

