在UITabBarController视图之间传递数据

时间:2013-06-08 07:07:57

标签: ios objective-c uitabbarcontroller nsuserdefaults

我已经搜索了一整天的一个简单的例子并且还没有找到它。我正在开发一个应用程序,我希望在初始加载时进行API调用,并填充一些可在任何选项卡视图中访问的变量。

示例:我想进行单个API调用以获取我的数据,其中包括与警报选项卡的警报相关的数据。我想在初始加载时使用此数据来更新“警报”选项卡徽章。但是,一旦此人转到该选项卡,我也希望在警报页面上使用该信息,而无需再次进行API调用以获取相同的信息。

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

5 个答案:

答案 0 :(得分:15)

使用UITabBarViewController的{​​{1}}属性访问标签栏控制器中的视图控制器阵列。根据您的标签栏控制器架构对它们进行测试。 然后使用该数组获取指向任何视图控制器的指针。

例如,假设您的标签栏控制器有5个标签,每个标签都有一个viewControllers,其特定UINavigationController作为根视图控制器。假设您要将第3个选项卡的徽章值设置为Web响应阵列计数。你可以这样做

UIViewController

您还可以通过对视图控制器进行类型转换来获取特定视图控制器的属性。例如

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

答案 1 :(得分:2)

我从昨天起就打开了这个问题并确保在发布之前进行搜索。没有类似的问题,我发现有答案,而且可能非常直接或者这可能不是这样做的方法,但这是我如何解决这个问题:使用NSUserDefaults和代码示例this page

答案 2 :(得分:2)

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

+ (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]

答案 3 :(得分:1)

将数据放入app委托对象中。您可以通过(MyAppDelegate *)[[UIApplication sharedApplication] delegate]从应用中的任意位置访问它,也可以为每个视图控制器提供一个明确的链接。

NSUserDefaults并不真正意味着在您的应用中全局共享数据,尽管它可以完成工作。如果您的应用程序下次无法连接到服务器,它还具有信息。这是好事还是坏事?

答案 4 :(得分:0)

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

每个需要该对象的viewControllers都应该只订阅该通知并只使用新数据。