【问题标题】:How to access variable across controllers?如何跨控制器访问变量?
【发布时间】:2014-08-14 19:22:48
【问题描述】:

所以我在我的 ViewController.h 中声明了这个:

@property (nonatomic) BOOL areThereAds;

如何在我的 AppDelegate.m 类中访问此变量,以便在 areThereAds == NO 时加载具有不同布局的不同故事板。

类似:

UIStoryboard *storyboard;

if (areThereAds == NO){
   storyboard == [UIStoryboard storyboardWithName:@"Main_iPhone-noAds" bundle:nil];
}
else{
   storyboard == [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil]
}

【问题讨论】:

  • 是否有广告由 ViewController 决定(即它是一个显示决定)或应用程序委托(..这是一个应用程序范围的问题)?

标签: objective-c ios7 appdelegate


【解决方案1】:

在整个应用程序中访问布尔值的另一种方法是将其存储在 [NSUserDefaults standardUserDefaults] 中,如下所示:

[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isCompleted"];
[[NSUserDefaults standardUserDefaults] synchronize];

从任何类中检索它

BOOL someBool = [[NSUserDefaults standardUserDefaults] boolForKey:@"isCompleted"];

【讨论】:

    【解决方案2】:

    当我在传递与外部 API 响应相关的数据时,我创建了一个单例类,我可以在每个 ViewController 实现文件中包含它的标头,然后获取单例实例,然后检索它的值。

    例如:

    ViewController1.h 内部:

    #include "SingletonClass.h"

    ViewController1.m 内部:

    [[SingletonClass getClassInstance] someBool:YES];
    

    在您要从中检索变量的类的头文件中:

    #include "SingletonClass.h"

    在您要从中检索变量的类的实现文件中:

    bool someBool =  [[SingletonClass getClassInstance] someBool]
    if (someBool) {
    
    } else {
    
    }
    

    我现在不在我的 Mac 前,所以这在语法上可能并不完全正确,但我希望它可以让您了解如何完成您的问题

    注意:IMO 接受的答案使用 NSUserDefaults 是不好的做法,因为它是一个系统范围的用户偏好数据库,将特定于应用程序的值分配给它感觉就像将它用于不适合的事情一样。 (我们想要在 Mac 上使用 Windows 风格的注册表吗?)

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2011-08-07
      • 2016-10-14
      • 2012-06-26
      • 1970-01-01
      • 2015-09-08
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多