【问题标题】:Loading ViewController data into the model将 ViewController 数据加载到模型中
【发布时间】:2013-05-09 05:38:27
【问题描述】:

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

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

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

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

我(显然)对iOS 比较陌生。

谢谢, 本

【问题讨论】:

    标签: iphone ios model-view-controller uiviewcontroller


    【解决方案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 属性。例如

    model.text = @"Hello, World";
    

    显然,只需将Model.h 中的属性更改为您想要的任何内容,而不是我的字符串和数组示例。

    【讨论】:

    • +1 完美。如果您将sharedManager 更改为sharedModel 以与类名称匹配,这听起来不错。
    • @Anupdas 好建议。这是我在 Xcode 中的自动 sn-ps 之一,所以我只是剪切和粘贴,但这当然是个好主意。我已经相应地更新了我的答案。
    • 谢谢!这成功了,非常有帮助。也感谢您的明确解释。
    【解决方案2】:

    我构建了一个与此类似的项目,其中几个视图控制器将信息添加到名为评估项的共享单例数据对象中。我创建了一个基本视图控制器,我所有的视图控制器都继承自它,只有一个属性(assessedItem),该属性具有一个覆盖的 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";
    

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2023-04-06
      • 2018-12-25
      • 2021-06-30
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多