2012-08-22 29 views
0

我已經(重)子類NSManagedObject的一個項目。它無縫地在原始項目中工作,毫不費力。爲什麼我的NSManagedObject子類方法不被識別?

我將這些文件複製到一個新的項目中,手動將相應的CoreData類添加到新的數據模型中。

不幸的是,我有'問題'。出於某種原因,有關子類的方法被忽略。兩個項目之間的代碼完全相同,但我突然間遇到了無法識別的選擇器問題。

NSFetchRequest *blockRequest=[[NSFetchRequest alloc] init]; 
NSEntityDescription *blockDesc=[NSEntityDescription entityForName:@"AdBlock" 
              inManagedObjectContext:context]; 
[blockRequest setEntity:blockDesc]; 

AdBlock *curBlock=[adBlocks objectAtIndex:blockIndex]; 

adBlocks=[context executeFetchRequest:blockRequest error:nil]; 

for (AdBlock *block in adBlocks) { 
    [block initAdBlock];//Crashes with unrecognized selector 
} 

我檢查了,並且相應的.m文件被添加到編譯器構建階段。該代碼完全是從字面上複製&粘貼,並且兩個項目之間是相同的 - 源代碼作品,目的地不。

我注意到,我沒有明確地告訴上下文它應該返回子類的類型,但這在舊項目中不是問題,那爲什麼它應該是新問題呢?

+1

因此您將新類添加到數據模型中,但是您是否已將類名更改爲您的自定義類? – Rog

回答

1

當這樣的事情發生在我身上時,我嘗試了兩件事。我做的第一件事是確保我正確地#導入NSManagedObject子類(我比我應該更頻繁地忘記這種方式),但正如你所說的你複製和粘貼,我不認爲這是你的問題。我嘗試的第二件事是通過轉到File> New> File然後NSManagedObject Subclass重新生成NSManagedObjects,然後選擇我更改了某些內容的NSManagedObjects。我建議您重建它們中的所有內容。看看是否有效。它可能不是,但它是一個容易開始的地方。

+0

* winces *如果我重建它們,我會放棄所有的自定義邏輯!哦,更容易重新創建,比在應用程序大喊'開始'正在工作' – RonLugge

+0

重建後,我建議您在添加自定義邏輯之前測試它。:) – esthepiking

+0

應用程序不會運行沒有自定義邏輯 - - 在這裏,我認爲我很聰明,讓班級處理它自己的東西,讓外部世界知道它需要知道什麼。 (封裝ftw,對不對?) – RonLugge

1

確保您檢查了模型,並確保已在檢查器中更改類名稱。否則,無論如何,它們都會返回NSManagedObjects。並且使用mogenerator,所以你不必擔心重新生成類。

1

我知道這個問題是陳舊的,但也許有人搜索會覺得這有幫助。

我一直在使用類別向NSManagedObject子類添加附加函數。這使我可以使用XCode命令生成類定義而不破壞任何自定義邏輯。羅恩在對選定答案的評論中提到了這一點 - 只是認爲值得引起注意,因爲我覺得這是一個非常漂亮的解決方案。

+0

是的 - 這是我的長期解決方案。包裝不完全有意義,所以我只是使用類別。 – RonLugge

相關問題