将ViewController数据加载到模型中

时间:2013-05-09 05:38:27

标签: iphone ios model-view-controller uiviewcontroller

我正在开发一个应用程序,该应用程序将从六个不同的视图控制器收集数据,然后创建所收集数据的PDF摘要。我知道有两种方法来聚合来自多个屏幕的信息,但两者看起来都很麻烦,足以让我有更好的方法。

选项#1 - 核心数据 - 使用NSManagedObjects然后在下一个视图控制器上获取,添加和重新保存,然后获取...并重新保存...然后获取并重新保存。最后获取所有内容以构建PDF

选项#2 - 在视图控制器之间传递数据。但似乎我必须将数据从当前VC传递到下一个,然后我必须将相同的数据重新传递到以下VC,依此类推。也放弃了。

当我调用该类时,是否有更简单的方法来聚合此数据并将其传递给PDF

我(显然)对iOS相对较新。

谢谢, 本

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但一种方法是定义一个所有视图控制器都可以访问的单例模型对象。例如,Model.h定义了两个属性textarray

#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];

现在,您可以根据自己的内容设置或获取textarray属性。 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";