问题描述
因此,当用户从登录页面移动到主页时,我想预取与标签栏控制器相关联的视图控制器中所需的一些数据(标签栏控制器存在于这两个视图控制器之间)。我在自定义 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
}
}
}
,
您可以通过多种方式实现这一目标。
- 使用 SuperViewController,
- 如果您想在非 TabbarViewVontroller 子类中访问,请使用 SingleTone 类。
- 如果数据很小,则保存在常见位置,例如常量。
- 在一个 VC 中预取数据,例如 Home,然后在点击时传递给所需的 VC。