是否可以将标签栏控制器类中从 Firebase 检索到的数据从标签栏控制器传输到视图控制器? Xcode, 斯威夫特

问题描述

因此,当用户登录页面移动到主页时,我想预取与标签栏控制器相关联的视图控制器中所需的一些数据(标签栏控制器存在于这两个视图控制器之间)。我在自定义 TabBarController 类中获取数据并使用以下代码发送它(不起作用):

override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
    
    if segue.destination is Profile { // Profile = one of the view controllers in the tab bar
            let vc = segue.destination as? Profile
            vc?.uid = self.userID
            vc?.name = self.name
            vc?.skills = self.skillSet
    }
    
}

这样做的最佳方法是什么?请注意,我无法在标签栏控制器之前预取数据,因为这是登录页面。如果我在主页(标签栏控制器 {home,search,profile})上预取个人资料页面数据,我如何将其传输到同一标签栏中的另一个视图控制器(用于个人资料)?

解决方法

最好的方法是什么?

  • 我相信一旦您执行登录调用(内部登录屏幕),您将拥有与该用户相关的用户 ID 和其他数据,因此在登录控制器中,您添加了用于将 Tabbar 控制器设为初始控制器的代码。

  • 因此基于这一点最好的办法是将 userData 存储到标签栏控制器中

  • 因此,一旦您将数据存入标签栏控制器(从登录或主屏幕),您就可以通过以下代码在标签栏内的任何根控制器(主页、搜索、配置文件)中获取用户数据。>

struct User { var userID: String? }

class TabbarController: UITabBarController {
    var userData: User
}

class HomeController: UIViewController {
 var userData: User?
   override func viewWillAppear(_ animated: Bool) {
       if let tabBar =  self.tabBarController as? TabbarController {
        self.userData = tabBar.userData
       }
   }
}

enter image description here

,

您可以通过多种方式实现这一目标。

  1. 使用 SuperViewController,
  2. 如果您想在非 TabbarViewVontroller 子类中访问,请使用 SingleTone 类。
  3. 如果数据很小,则保存在常见位置,例如常量。
  4. 在一个 VC 中预取数据,例如 Home,然后在点击时传递给所需的 VC。