在我的iPhone App中,有两个UIViewControllers;两者都嵌入在UITabBarController中。但是,当点击TabBarController和VC的开关时,屏幕上的VC会将数据上传到NSUserDefaults,然后将切换到的VC上传,从NSUserDefaults获取该数据。
我目前所做的是在第一个VC的viewWillDisappear中上传数据,然后在第二个VC的viewWillAppear中获取它。 问题是即将放到屏幕上的VC的viewWillAppear会在“旧”VC 的viewWillDisappear之前调用,因此它会尝试获取尚未上传的数据。
我可以使用什么,所以“旧VC”是第一个知道什么时候要离屏的人,所以它可以在新数据取出数据之前上传数据?
*我也尝试过设置一个UITabBArControllerDelegate,这样旧的VC就会收到 - tabBarController:didSelectViewController:但是调用得太晚了。
答案 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
就可以确定哪些控制器需要它。