现在我正在开发一个iOS应用程序,其工作原理如下: 用户扫描QR码, 应用程序搜索特定密钥 - >值, 它为用户提供了一个价值。
目前我有两个ViewControllers - 主要和“值”ViewController,它继承自main。问题是如果我在主VC中创建NSDictionary,它在“值”VC中是不可见的。主VC只通过segue给出字符串(QR码,密钥)。因此,VC必须搜索密钥并显示该值。
我要问的是整个应用程序中可见的某种全局变量或一个DataSource。当然,我可以在值ViewDidLoad方法中实现NSDictionary初始化,它会起作用,但这不是重点。在那里添加新模块,变量必须是全局的。我google了很多,并且认为单例模式在这里很有帮助。我试图实现它,但不知道该怎么做。我是否需要它,或者它对于这种DataSource来说太复杂了?
谢谢!
答案 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;