如何在UITabBarController中的两个UIViewController之间传递信息

在我的iPhone应用程序中,有两个UIViewControllers; 都embedded在UITabBarController中。 但是,当轻击TabBarController和VC的开关时,VC屏幕将数据上传到NSUserDefaults,然后切换到的VC从NSUserDefaults中获取数据。

我目前所做的是在第一个VC的viewWillDisappear中上传数据,然后在第二个VC的viewWillAppear中获取它。 问题是viewWill将要放在屏幕上的VC会在viewWill之前调用“老”VC,所以它试图获取尚未上传的数据。

我可以使用什么,所以“旧VC”是第一个知道什么时候离开屏幕,以便在新数据获取之前上传数据?

*我也尝试设置一个UITabBArControllerDelegate,所以旧的VC会收到 – tabBarController:didSelectViewController:但是被调用的太迟了。

如果您不会传输大量信息,则可以使用默认variables作为众多选项之一。 这可能不是最好的,但它会起作用。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:Variable forKey:@"variable"]; [defaults synchronize]; 

设置variables

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *fetchVariable = [defaults objectForKey:@"variable"]; 

在其他VC中检索它。

写作和回读听起来像是不必要的开销。 当然,除非你需要写信。

我会让以前的UIViewController把包裹在一个对象中的所有数据传递给UITabBarController ,然后将它传递给新的UIViewController 。 如果这是所有(或大部分)选项卡的模式,那么创build一个新的协议,让你的UIViewController实现它。 你的UITabBarController能够通过简单的检查控制器是否符合你的协议来找出哪些控制器需要它。

我可以使用什么,所以“旧VC”是第一个知道什么时候离开屏幕,以便在新数据获取之前上传数据?

您可以尝试使用– tabBarController:didSelectViewController: UITabBarControllerDelegate方法将数据保存在NSUserDefaults ; 这应该是在viewWillAppear之前肯定会调用的任何控制器。

如果你想保持你目前的做法,请尝试在第二个视图控制器中使用viewDidAppear:而不是viewWillAppear: 如果你没有从NSUserDefaults获取大量数据(这应该是这样,我猜),如果你的第二个视图控制器UI没有引入延迟显示数据,这应该正常工作。

另一种方法是让第一个控制器在NSUserDefaults更新其数据。