将数据从标签栏切换到另一个视图控制器
Passing data from a tab bar switch right into another view controller
这个问题可能听起来很复杂,所以让我减轻压力*
假设我有 2 个标签栏选项卡(主页 1、主页 2)
两个(Home1,Home2)都有导航控制器,每个都有两个视图控制器
Home1(导航控制器 -> VC11 -> VC12)
Home2(导航控制器 -> VC21 -> VC22)
简单吧?好吧,不完全是
我想做的是将数据从[Home1: VC12 传到Home2: VC22]。
我的编码工作:
tabBarController!.selectedIndex = 1
self.navigationController!.popToViewController(navigationController!.viewControllers[1] as! (Home2: VC22), animated: false)
let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
navController.popToViewController((Home2: VC22) as! UIViewController, animated: true)
for oneView in (self.navigationController?.viewControllers)! {
if (oneView.isKind(of: (Home2: VC22).classForCoder())) {
let friendView = oneView as! (Home2: VC22)
friendView.testing = "Worked?"
}
}
欢迎任何帮助!!总时数:8 小时
您的传递数据任务正在进行此过程
V12 --(pop)--> V11 --(switch)--> V21 --(push)--> V22
如果您选择传递数据,您将需要通过所有这三个事务来传递它,这需要大量的编码并且很难实践。
实现您的目标的更好方法是将数据存储在 V12 中,然后从 V22 加载它,而不是四处传递数据。所以现在你只需要担心如何将用户从V12转移到V22。
只需要两行代码就可以从UserDefaults
中存储和读取数据
在你的V12上,在你进行上述交易之前,先这样保存你的数据
UserDefaults.standard.set("yourStringData", forKey: "data")
然后当你从viewDidLoad
到达VC22时,以这种方式读取存储的信息
UserDefaults.standard.string(forKey: "data")
对于您的视图事务部分,popToViewController
用于从子视图控制器到它的父视图控制器。因此,当您切换选项卡并获得 UINavigationController
时,topViewController
必须是 VC21。因此,如果您通过故事板转场将它们连接起来,则转到 VC22,只需这样称呼它
let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
let VC21 = navController.topViewController!
VC21.performSegue(withIdentifier: "segue", sender: nil)
您还可以子类化您的标签栏并创建一个变量来存储您的数据。然后 VC 都可以访问数据。这种方式也减轻了对单例的可能需求。
听起来您需要重新考虑您的方法。这取决于您设置应用程序的方式,但除了直接将数据从一个 VC 传递到另一个之外,将这些数据存储在其他地方也是有意义的。以下是一些选项:
存储数据的单例,然后将其从一个 VC 传递到另一个 VC12 存储数据在单例中,然后 VC22 可以轻松访问它,因为它也可以访问单例。
让 Container 视图控制器存储要在其子视图控制器之间共享的数据。因此,在此示例中,TabBarController 可以存储此数据。
使用 UserDefaults 作为穷人 Singleton/Persistence 解决方案。
使用 SQLite、Core Data 或 Realm 等完整的数据持久层来存储和检索数据。
...还有其他解决方案,但我认为根据您的需要,其中一种解决方案可以很好地满足您的需求。
这个问题可能听起来很复杂,所以让我减轻压力*
假设我有 2 个标签栏选项卡(主页 1、主页 2)
两个(Home1,Home2)都有导航控制器,每个都有两个视图控制器
Home1(导航控制器 -> VC11 -> VC12)
Home2(导航控制器 -> VC21 -> VC22)
简单吧?好吧,不完全是
我想做的是将数据从[Home1: VC12 传到Home2: VC22]。
我的编码工作:
tabBarController!.selectedIndex = 1
self.navigationController!.popToViewController(navigationController!.viewControllers[1] as! (Home2: VC22), animated: false)
let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
navController.popToViewController((Home2: VC22) as! UIViewController, animated: true)
for oneView in (self.navigationController?.viewControllers)! {
if (oneView.isKind(of: (Home2: VC22).classForCoder())) {
let friendView = oneView as! (Home2: VC22)
friendView.testing = "Worked?"
}
}
欢迎任何帮助!!总时数:8 小时
您的传递数据任务正在进行此过程
V12 --(pop)--> V11 --(switch)--> V21 --(push)--> V22
如果您选择传递数据,您将需要通过所有这三个事务来传递它,这需要大量的编码并且很难实践。
实现您的目标的更好方法是将数据存储在 V12 中,然后从 V22 加载它,而不是四处传递数据。所以现在你只需要担心如何将用户从V12转移到V22。
只需要两行代码就可以从UserDefaults
在你的V12上,在你进行上述交易之前,先这样保存你的数据
UserDefaults.standard.set("yourStringData", forKey: "data")
然后当你从viewDidLoad
到达VC22时,以这种方式读取存储的信息
UserDefaults.standard.string(forKey: "data")
对于您的视图事务部分,popToViewController
用于从子视图控制器到它的父视图控制器。因此,当您切换选项卡并获得 UINavigationController
时,topViewController
必须是 VC21。因此,如果您通过故事板转场将它们连接起来,则转到 VC22,只需这样称呼它
let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
let VC21 = navController.topViewController!
VC21.performSegue(withIdentifier: "segue", sender: nil)
您还可以子类化您的标签栏并创建一个变量来存储您的数据。然后 VC 都可以访问数据。这种方式也减轻了对单例的可能需求。
听起来您需要重新考虑您的方法。这取决于您设置应用程序的方式,但除了直接将数据从一个 VC 传递到另一个之外,将这些数据存储在其他地方也是有意义的。以下是一些选项:
存储数据的单例,然后将其从一个 VC 传递到另一个 VC12 存储数据在单例中,然后 VC22 可以轻松访问它,因为它也可以访问单例。
让 Container 视图控制器存储要在其子视图控制器之间共享的数据。因此,在此示例中,TabBarController 可以存储此数据。
使用 UserDefaults 作为穷人 Singleton/Persistence 解决方案。
使用 SQLite、Core Data 或 Realm 等完整的数据持久层来存储和检索数据。
...还有其他解决方案,但我认为根据您的需要,其中一种解决方案可以很好地满足您的需求。