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

时间:2012-12-30 08:42:24

标签: iphone ios uiview uiviewcontroller uitabbarcontroller

在我的iPhone App中,有两个UIViewControllers;两者都嵌入在UITabBarController中。但是,当点击TabBarController和VC的开关时,屏幕上的VC会将数据上传到NSUserDefaults,然后将切换到的VC上传,从NSUserDefaults获取该数据。

我目前所做的是在第一个VC的viewWillDisappear中上传数据,然后在第二个VC的viewWillAppear中获取它。 问题是即将放到屏幕上的VC的viewWillAppear会在“旧”VC 的viewWillDisappear之前调用,因此它会尝试获取尚未上传的数据。

我可以使用什么,所以“旧VC”是第一个知道什么时候要离屏的人,所以它可以在新数据取出数据之前上传数据?

*我也尝试过设置一个UITabBArControllerDelegate,这样旧的VC就会收到 - tabBarController:didSelectViewController:但是调用得太晚了。

3 个答案:

答案 0 :(得分:4)

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

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

设置变量

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

在另一个VC中检索它。

答案 1 :(得分:0)

  

我可以使用什么,所以“旧VC”是第一个知道什么时候要离屏的人,所以它可以在新数据取出数据之前上传数据?

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

如果您想保留当前的方法,请尝试在第二个视图控制器中使用viewDidAppear:而不是viewWillAppear:。 如果您没有从NSUserDefaults获取大量数据(我认为应该是这种情况),并且您的第二个视图控制器UI没有引入显示数据的延迟,这应该可以正常工作。

另一种方法是让第一个控制器每次更改时都在NSUserDefaults更新数据。

答案 2 :(得分:0)

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

我会让之前的UIViewController将对象中包含的所有数据传递给UITabBarController,然后将其传递给新的UIViewController。如果这是所有(或大部分)选项卡的模式,请创建一个新协议,让UIViewController实现该协议。然后,只需检查控制器是否符合您的协议,您的UITabBarController就可以确定哪些控制器需要它。