我正在开发一个应用程序,该应用程序将从六个不同的视图控制器收集数据,然后创建所收集数据的PDF摘要。我知道有两种方法来聚合来自多个屏幕的信息,但两者看起来都很麻烦,足以让我有更好的方法。
选项#1 - 核心数据 - 使用NSManagedObjects
然后在下一个视图控制器上获取,添加和重新保存,然后获取...并重新保存...然后获取并重新保存。最后获取所有内容以构建PDF
。
选项#2 - 在视图控制器之间传递数据。但似乎我必须将数据从当前VC
传递到下一个,然后我必须将相同的数据重新传递到以下VC
,依此类推。也放弃了。
当我调用该类时,是否有更简单的方法来聚合此数据并将其传递给PDF
?
我(显然)对iOS
相对较新。
谢谢, 本
答案 0 :(得分:1)
有很多方法可以做到这一点,但一种方法是定义一个所有视图控制器都可以访问的单例模型对象。例如,Model.h
定义了两个属性text
和array
:
#import <Foundation/Foundation.h>
@interface Model : NSObject
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) NSMutableArray *array;
+ (instancetype)sharedModel;
@end
Model.m
只实现允许各种控制器访问此共享模型的sharedManager
方法:
#import "Model.h"
@implementation Model
+ (instancetype)sharedModel
{
static id sharedMyModel = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyModel = [[self alloc] init];
});
return sharedMyModel;
}
@end
然后,如果视图控制器想要使用它,只需包含一个
#import "Model.h"
在顶部,然后任何视图控制器都可以通过以下方式访问模型:
Model *model = [Model sharedModel];
现在,您可以根据自己的内容设置或获取text
和array
属性。 e.g。
model.text = @"Hello, World";
显然,只需将Model.h
中的属性更改为您想要的内容,而不是我的字符串和数组示例。
答案 1 :(得分:1)
我构建了一个与此类似的项目,其中多个视图控制器将信息添加到名为assessItem的共享单例数据对象中。我创建了一个基本视图控制器,我的所有视图控制器都继承了它只有一个属性(assessItem),并为该属性重写了一个getter:
-(AssessedItem *)assessedItem {
if (! _assessedItem) {
_assessedItem = [AssessedItem assessedItem];
}
return _assessedItem;
}
在AssessedItem类中,我有一个类方法:
+ (id)assessedItem {
static AssessedItem *assessedItem = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
assessedItem = [[self alloc] init];
});
return assessedItem;
}
AssessedItem类有很多属性,然后你可以使用普通的点语法设置这些属性:
self.assessedItem.someProperty = @"whatever";