在UITabBarController视图之间传递数据

我已经search了一整天在这个简单的例子,还没有find它。 我正在开发一个应用程序,我想在初始加载时进行一次API调用,并填充一些在任何标签视图中都可以访问的variables。

示例:我想进行一次API调用,以获取包含与警报选项卡相关的警报数据的数据。 我想在初始加载时使用这些数据来更新“警报”选项卡徽章。 不过,我也想在警报页面上使用这些信息,而不必再进行另一次API调用以获取相同的信息。

我读了很多不符合我要求的解释,所以我正在寻找一个很好的例子来帮助我。

使用你的UITabBarViewControllerviewControllers属性来访问你的标签栏控制器中的视图控制器数组。 根据您的标签栏控制器的架构来进行input。 然后获取一个指向任何视图控制器使用该数组。

例如,假设你的标签栏控制器有5个标签,每个标签都有一个UINavigationController ,它具有特定的UIViewController作为根视图控制器。 假设您要将第三个标签的徽章值设置为您的Web响应arrays计数。 你可以这样做

 [[[self.tabviewController viewControllers] objectAtIndex:2] setBadgeValue:[NSString stringWithFormat:@"%d",[myArray count]]; 

你也可以通过types化视图控制器来获得特定的视图控制器的属性。 例如

 MyViewController *myVc = (MyViewController*) [[(UINavigationController*)[[self.tabviewController viewControllers] objectAtIndex:2] viewControllers] objectAtIndex:0]; [myVc setPropertyName:propertyValue]; 

我从昨天起打开了这个问题,并确保在发布之前进行search。 没有类似的问题,我发现有答案,它可能是非常直接的,也许这不是这样做的方式,但这是我如何解决这个问题:使用NSUserDefaults和本页上的代码示例

将所有这些variables放在一个类中,并随时访问它的共享实例。 加

 + (YourClass *)sharedObject { static YourClass *sharedClassObject = nil; if (sharedClassObject == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedClassObject = [[YourClass alloc] init]; //Initialise it here if necessary }); } return sharedClassObject; } 

要访问共享实例,只需使用[YourClass sharedObject]

把数据放在你的应用程序委托对象中。 您可以通过(MyAppDelegate *)[[UIApplication sharedApplication] delegate]在应用程序的任何位置访问它,也可以为每个视图控制器指定一个明确的链接。

NSUserDefaults并不是真的用来在应用程序中全局共享数据,尽pipe它可以完成工作。 如果您的应用程序下次无法连接到服务器,则信息仍然存在。 这是好事还是坏事?

您应该使用NSNotificationCenter发布新数据到达的通知,并将新数据作为对象发布。

每个需要该对象的viewController都应该只订阅该通知,而只是使用新的数据。