如何在视图控制器之间使用共享数据

How to use share data between view controlles

我想在视图之间使用数据,但我有一个标签栏视图控件。实际上我的初始视图登录视图我得到 "access_token" 作为刺痛,如果我可以成功登录传递选项卡栏控件的第一个视图,但我想在第二个选项卡栏视图中使用访问令牌字符串从 web 服务获取另一个数据。如何在选项卡栏控制器的第二个视图中获取访问令牌字符串?

self.strSuccessful = json["acces_token"] as? String

标签栏视图控制器中的第二个视图

class SalesVC: UIViewController {
   var strAccesToken: String!
  }

我的初始(第一个视图控制器不包含标签栏,因为登录屏幕)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let salesViewController = segue.destination as! SalesVC

    salesViewController.strAccessToken = strSuccessfulAccesToken


}

最简单的解决方案是您可以使用 UserDefaults 并将访问令牌存储在 LoginController 中,然后 SecondTabController 从用户默认设置中检索访问令牌。

UserDefaults

中保存访问令牌
UserDefaults.standard.set(strSuccessfulAccesToken, forKey: "AccessToken")

现在 SecondTabController 从用户默认值中检索访问令牌。

if let accessToken =  UserDefaults.standard.string(forKey: "AccessToken") {
    print(accessToken)
}

如果您想从 LoginController 手动传递访问令牌,请像这样在 LoginControllerprepareForSegue 中设置访问令牌。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let tabbar = segue.destination as! UITabBarController
    if let salesVC = tabbar.viewControllers[1] as? SalesVC {
        salesVC.strAccessToken = strSuccessfulAccesToken
    }
}

在一般情况下,您可以使用 UserDefaults 来存储简单数据(例如 UI 偏好),但您提到了 访问令牌 ,如果你想保护用户帐户,你应该小心并选择像 Keychain 这样的安全存储。

请记住,UserDefaults 只是一个简单的 XML 文件,任何有权访问设备的人都可以阅读它。

This 是关于安全 iOS 用户数据

的好教程

我想您是在问如何在标签栏控制器内的不同视图控制器之间传输数据。我是这样做的:

定义标签栏 class 和保存数据的变量:

class ItemTabBarController: UITabBarController {
    var allTags: [TagData] = []

    override func viewDidLoad() {
        print("ItemTabBarController.viewDidLoad")
    }
}

确保故事板中标签栏的自定义 class 属性 是 "ItemTabBarController"

在每个想要在标签栏中设置值的视图控制器中:

func configureItemTabBarController() {
        let itemTabBarController = self.tabBarController  as! ItemTabBarController
        self.viewModel.allTags = viewModel.configureAllTags()
        itemTabBarController.allTags = self.viewModel.allTags
    }