2013-07-01 88 views
1

我通过核心数据创建了几个类。我需要在运行时为其中一个类添加其他@property。此@property s负责下载进度,我不想将它们存储在Core Data DB中。我试图用一个单独的扩展类:将@propertys添加到核心数据类

@interface MyClass() 

    { 
     CGFloat _downloadProgress; 
     NSInteger _downloadErrorCounter; 
     BOOL _downloadAllStuff; 
     BOOL _downloadUserCanceled; 
    } 

    @property (nonatomic, assign) CGFloat downloadProgress; 
    @property (nonatomic, assign) NSInteger downloadErrorCounter; 
    @property (nonatomic, assign) BOOL downloadAllStuff; 
    @property (nonatomic, assign) BOOL downloadUserCanceled; 

@end 

但私有变量是不可见出的MyClass和@property小号编译所有的权利,但在运行时我得到-[MyClass setDownloadErrorCounter:]: unrecognized selector sent to instance。 任何人都可以建议我一些解决方案吗?

+0

你在你的m文件中有@dynamic吗? – Mikael

+2

你有没有'@合成'setters和getters?即使在现代Objective-C中,你也不需要'@ synthesize',看起来有必要在NSManagedObject子类中进行合成。编译器应该向你显示一个警告,你必须为你的属性定义一个setter和getter。 –

+0

不,我没有。它是核心数据,所以我不能更改核心数据类。我使用一个新的文件MyClass_Download.h来声明属性。我可以在哪里合成它们? –

回答

6

最简单的解决方案(如果你不希望修改Xcode的生成的类文件)是为瞬态添加的属性到核心数据模型和定义 性能。瞬态属性不会保存到商店文件。

另一种选择是使用工具,如“mogenerator”,它会为每个 实体上的两个类文件,一个用于核心数据特性(这是如果模型更改覆盖), ,一个用于自定义属性(这是不是覆盖)。

更新:Xcode的7起, Xcode中都将创建类和 一个每个管理对象子类别,比较NSManagedObject subclass property in category。可以将定制属性添加到类别 定义中,该定义在模型更改时不会被覆盖。

+0

非常有趣!我会尝试一下并报告回来! –

+0

或者试试:https://github.com/magicalpanda/MagicalRecord – Mikael

+0

@Mikael:我还没有使用过MagicalRecord。它是否允许将自定义属性添加到托管对象子类中?我无法从文档或头文件中看到它。 –

1

在@implementation只需添加

@synthesize downloadErrorCounter = _downloadErrorCounter; 
... 

。请注意,不是@动态。

+2

应该注意的是,如果您更改模型并让Xcode创建新的类文件,则实现文件将被覆盖,并且您的更改将丢失。 –

+0

@MartinR是的。 – Kjuly

+0

@Kjuly,为什么不在这种情况下使用“@dynamic”? – Mikael

0

当试图使用@synthesize解决方案,我得到了错误:

@synthesize not allowed in a category's implementation. 

解决方案是使用相关联的对象为在本博客中描述:http://kaspermunck.github.io/2012/11/adding-properties-to-objective-c-categories/

MyManagedObject + Additions.h

@property (strong, nonatomic) NSString *test; 

MyManagedObject + Additions.m

NSString const *key = @"my.very.unique.key"; 

- (void)setTest:(NSString *)test 
{ 
    objc_setAssociatedObject(self, &key, test, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (NSString *)test 
{ 
    return objc_getAssociatedObject(self, &key); 
}