4

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

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

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

4

5 回答 5

15

使用您UITabBarViewControllerviewControllers属性访问标签栏控制器中的视图控制器数组。根据您的标签栏控制器架构对它们进行类型转换。然后使用该数组获取指向任何视图控制器的指针。

例如,假设您的选项卡栏控制器有 5 个选项卡,每个选项卡都有一个作为根视图控制器的UINavigationController特定选项卡。UIViewController假设您要将第三个选项卡的徽章值设置为您的网络响应数组计数。你可以这样做

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

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

MyViewController *myVc = (MyViewController*) [[(UINavigationController*)[[self.tabviewController viewControllers] objectAtIndex:2] viewControllers] objectAtIndex:0];
[myVc setPropertyName:propertyValue];
于 2013-06-08T07:16:05.423 回答
2

我从昨天开始就输入了这个问题,并确保在发布之前进行搜索。我发现没有类似的问题有答案,它可能非常简单,或者这不是解决问题的方法,但这是我解决这个问题的方法:使用NSUserDefaults和此页面上的代码示例

于 2013-06-08T07:07:56.837 回答
1

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

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

于 2013-06-08T07:45:40.920 回答
1

将数据放入您的应用委托对象中。您可以通过 ,从应用程序中的任何位置访问它(MyAppDelegate *)[[UIApplication sharedApplication] delegate],或者您可以为每个视图控制器提供指向它的显式链接。

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

于 2013-06-08T14:31:52.910 回答
0

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

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

于 2015-08-30T12:12:10.473 回答