一个NSDictionary在应用程序中随处可见

时间:2014-05-23 01:49:44

标签: objective-c uiviewcontroller nsdictionary global

现在我正在开发一个iOS应用程序,其工作原理如下: 用户扫描QR码, 应用程序搜索特定密钥 - >值, 它为用户提供了一个价值。

目前我有两个ViewControllers - 主要和“值”ViewController,它继承自main。问题是如果我在主VC中创建NSDictionary,它在“值”VC中是不可见的。主VC只通过segue给出字符串(QR码,密钥)。因此,VC必须搜索密钥并显示该值。

我要问的是整个应用程序中可见的某种全局变量或一个DataSource。当然,我可以在值ViewDidLoad方法中实现NSDictionary初始化,它会起作用,但这不是重点。在那里添加新模块,变量必须是全局的。我google了很多,并且认为单例模式在这里很有帮助。我试图实现它,但不知道该怎么做。我是否需要它,或者它对于这种DataSource来说太复杂了?

谢谢!

2 个答案:

答案 0 :(得分:3)

基本思想是,你仍然需要#include这个词典所在地的头文件。 Naveen提出的解决方案意味着您将在任何位置包含应用程序委托的标头。是否为此目的使用应用程序代表有点灰色。有些人经常这样做,有人说它很难用。

单例方法意味着您将创建一个类,它将始终包含相同的信息,因为init方法将返回先前创建的对象。

对于singleton aproach,假设我有一个数据库管理器类。所以在这个类的标题(DatabaseManagerSingleton.h)中有这个:

@interface DatabaseManager : NSObject

+ (DatabaseManager*)sharedInstance;

// Your dictionary
@property (nonatomic,strong) NSMutableDictionary* someDictionary;

实现将如下所示:(检查“sharedInstance”如何初始化对象)

@implementation DatabaseManager

#pragma mark - Singleton Methods

+ (DatabaseManager*)sharedInstance {

    static DatabaseManager *_sharedInstance;
    if(!_sharedInstance) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^{
            _sharedInstance = [[super allocWithZone:nil] init];
        });
    }

    return _sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {

    return [self sharedInstance];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        // Custom initialization
        _someDictionary = [[NSMutableDictionary alloc] init];
    }
    return self;
}

现在,一个非常重要的事情是,您想要使用此对象的任何地方都应首先包含标题:

编辑:在您的代码中使用它:

1)添加标题

#import "DatabaseManager.h"

2)初始化对象

DatabaseManager *databaseManager = [DatabaseManager sharedInstance];

3)做你需要的任何事情

// Initialize the dictionary
databaseManager.someDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"OBJECT",@"someKey", nil];  // In this case the object is just a NSString.

// Access
[databaseManager.someDictionary objectForKey:@"someKey"];

答案 1 :(得分:2)

作为Appdelegate的财产

 @property (nonatomic,strong) NSDictionary * sharedData;

访问

之类的任何地方
NSDictionary *sharedData= ((APPDelegate *) [UIApplication sharedApplication].delegate).sharedData;