首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖UIManagedDocument中的managedObjectModel

覆盖UIManagedDocument中的managedObjectModel
EN

Stack Overflow用户
提问于 2011-10-24 23:59:05
回答 2查看 1.5K关注 0票数 5

我正在使用iOS 5.0中的新UIDocument特性。我有一个现有的应用程序,它使用多个不同的数据模型(momd文件)。根据UIManagedDocument的文档,您可以覆盖-(NSManagedObjectModel*)managedObjectModel来加载特定的数据模型(缺省值是加载所有找到的数据模型合并在一起)。这两个数据模型都有重叠的模型名称和不同的模式,因此在我的例子中这是不可取的。

Relevant Apple Doc

所以,在一个简单的示例中,我遇到的问题是,我可以覆盖该函数,但不能将其结果赋值。它既是私有的,因此子类无法访问_managedObjectModel;而且,它是只读的,因此无法分配self.managedObjectModel。

我一直在寻找一个超越managedObjectModel的UIManagedDocument示例,但苹果似乎没有提供这样的示例。

我也许能够定义一个新的实例变量_myManagedObjectModel并将其赋值。然后在我重写的访问器上返回它。我担心的是,这可能会破坏UIManagedDocument的一些内部实现,这些实现不使用managedObjectModel访问器,而是首选_managedObjectModel (这在苹果实现中很常见……)

这似乎是一个直截了当的问题,我怀疑我只是遗漏了一些非常简单的东西来允许适当的覆盖。

代码语言:javascript
复制
//
//  DTNoteDocument.m
//  document-test
//
//

#import "DTNoteDocument.h"

@implementation DTNoteDocument

NSString * const kDataManagerModelName = @"Note";

-(NSManagedObjectModel*)managedObjectModel {

    if (_managedObjectModel != nil)
        return _managedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; // compile error on this line, private variable cannot be assigned

    return _managedObjectModel;
}
@end

标题:

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface DTNoteDocument : UIManagedDocument

@end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-01 04:10:00

我上周解决了这个问题,但我想我应该更新一下以反映我的解决方案。如果你找到更好的东西,我会很高兴看到的。

我在starts的类头中添加了一个唯一的属性:

代码语言:javascript
复制
@property (nonatomic,retain,readonly) NSManagedObjectModel *myManagedObjectModel;

然后在我的类实现中添加了以下内容:

代码语言:javascript
复制
-(NSManagedObjectModel*)myManagedObjectModel {
    if (myManagedObjectModel)
        return myManagedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    myManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

    return myManagedObjectModel;
}

-(NSManagedObjectModel*)managedObjectModel {
    return self.myManagedObjectModel;
}

因为我可以重写managedObjectModel的get属性,所以可以很好地工作。到目前为止,在我的测试和实现中,UIManagedDocument初始化并正常工作。执行跟踪显示managedObjectModel在init上被调用,所以我假设从返回的结果中一切都被正确初始化。

票数 5
EN

Stack Overflow用户

发布于 2012-05-25 18:50:35

我终于找到了你的解决方案的问题所在。UIManagedDocument应该允许我们更改objectmodelLoading选项...

您的代码中缺少以下内容:

.m文件

代码语言:javascript
复制
#import <CoreData/CoreData.h>

@implementation DTNoteDocument{
    NSManagedObjectModel * myManagedObjectModel;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7878463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档