2013-07-01 104 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); 
}