问题可能听起来很复杂,所以让我缓解压力*
假设我有2个标签栏标签(Home1,Home2)
两者(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?"
}
}
ANYHELP很受欢迎!花费的总时间:8小时
答案 0 :(得分:0)
您的传递数据任务正在进行此过程
V12 - (pop) - > V11 - (开关) - > V21 - (推) - > V22 强>
如果您选择传递数据,则需要通过所有这三项交易并将其传递给大量编码并且很难实践。
不是传递数据,而是实现目标的更好方法是将数据存储在V12中,然后从V22加载它。所以现在你需要担心的是如何将用户从V12转移到V22。
您只需要两行代码来存储和读取UserDefaults
在您的V12上,在您执行上述交易之前,请先保存您的数据
UserDefaults.standard.set("yourStringData", forKey: "data")
然后当你从viewDidLoad
到达VC22时,以这种方式读取存储的信息
UserDefaults.standard.string(forKey: "data")
对于您的查看事务部分,popToViewController
用于从子视图控制器转到它的父级。因此,当您切换标签并获取UINavigationController
时,topViewController
必须为VC21。因此,如果您通过故事板segue连接它们,请转到VC22,只需将其称为“
let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
let VC21 = navController.topViewController!
VC21.performSegue(withIdentifier: "segue", sender: nil)
答案 1 :(得分:0)
您还可以对tabbar进行子类化并创建一个变量来存储数据。然后两个VC都可以访问数据。这种方式也减轻了对单身人士的可能需求。
答案 2 :(得分:0)
听起来你需要重新思考你的方法。这取决于您设置应用程序的方式,但除了将数据从一个VC直接传递到另一个VC之外,将这些数据存储在其他地方是有意义的。以下是一些选项:
单例存储您的数据并将其从一个VC传递到另一个VC,这样如果 VC12 将数据存储在Singleton中,那么 VC22 可以访问它因为它也可以访问单身人士。
让 Container View Controller存储要在其子视图控制器之间共享的数据。因此,在此示例中, TabBarController 可以存储此数据。
使用 UserDefaults 作为穷人的Singleton / Persistence解决方案。
使用SQLite,Core Data或Realm等完整的数据持久层来存储和检索数据。
......还有其他人,但我认为根据您的需要,其中一种解决方案可以很好地适用于您。