2012-12-30 23 views
1

在我的iPhone应用程序,有两个UIViewControllers;都嵌入在UITabBarController中。但是,当轻击TabBarController和VC的开关时,VC屏幕将数据上传到NSUserDefaults,然后切换到的VC从NSUserDefaults中获取该数据。如何传递两个UIViewControllers之间的信息的一个的UITabBarController

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

我可以用这样的“老VC”是第一个新的获取这些数据之前,知道什么时候是准备去离屏幕,因此它可以将数据上传?我也尝试设置一个UITabBArControllerDelegate,这样旧的VC就会收到--tabBarController:didSelectViewController:但是也会被调用得太晚。

回答

4

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

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

要设置变量

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

在其他VC进行检索。

+0

是的,我得到了那部分覆盖,问题是何时上传变量,所以它发生在下一个vc下载之前 –

+1

对不起,我误解了这个问题! – Naux

+0

这个答案帮了我。我过去一天想做这样的事情。非常感谢@Naux。 – Donovan

0

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

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

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

你有另一种方法是使第一控制器NSUserDefaults每次改变时间更新其数据。

+0

是的,我这样做,但后来我不得不重新加载数据,所以它在屏幕上闪烁,然后更新的版本出现后第二秒 –

+0

使用'tabBarController:didSelectViewController'做什么保存... – sergio

0

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

我会让前面的UIViewController将包装在对象中的所有数据传递给UITabBarController,然后将其传递给新的UIViewController。如果这是所有选项卡(或大多数选项卡)的模式,请创建一个新协议并让您的实施。然后您的UITabBarController就可以通过简单地检查控制器是否符合您的协议来找出哪些控制器需要它。

相关问题