2010-11-20 103 views
2

我有一個子類NSManagedObject與CoreDataGeneratedAccessors如下:擴展CoreDataGeneratedAccessors行爲

- (void)addCoursesObject:(Course *)value; 
- (void)removeCoursesObject:(Course *)value; 
- (void)addCourses:(NSSet *)value; 
- (void)removeCourses:(NSSet *)value; 

當對象被添加或使用上述存取器移除,我需要一些其他的代碼運行。

能有效地想要做這樣的事情,在實現文件:

-(void)addCoursesObject:(Course *)value { 
    [super addCoursesObject:value]; 
    … my additional code here … } 

但超級無厘頭,因爲NSManagedObject沒有「-addCourseObject」。在NSSet課程中添加一個觀察者似乎也許是一種方法,但我寧願只實現我自己的訪問器,然後定義它的工作方式,就像實現@synthesized訪問器超出默認行爲一樣。

有沒有一種方法可以調用原來的行爲,類似於上面的'[super ...]行?

想法?其他方法?

感謝。

回答

4

您不能覆蓋訪問器,只需要在.m文件中編寫自己的代碼即可。

在數據模型編輯器中,如果選擇關係,則可以從上下文菜單中選擇「將Objective-C 2.0實現複製到剪貼板」。這會給你訪問器的功能框架。然後您可以輕鬆定製它們。

+0

有關副本的好建議。我在文檔中找到足夠的東西來拼湊一些有用的東西,但是當我首先認識到這個菜單項時,我會節省大量的工作。所以下一次,我會適當武裝。非常感謝TechZen。 19k + 1給你。 ;) – Woodster 2010-11-25 03:02:43

+0

不幸的是,複製上下文菜單在Xcode 5中消失了。 – 2014-05-04 17:29:35

7

複製到剪貼板功能似乎在Xcode 4中消失了。另一種方法是進入代碼片段庫(View/Utilities/Code Snippet Library)並將其中一個「Core Data xxx訪問器」拖到.m文件中文件。你會得到的方法是這樣的:

- (void)add<#Capitalized relationship name#>Object:(<#Relationship destination class#> *)value {  
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; 
    [self willChangeValueForKey:@"<#Relationship name#>" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 
    [[self primitiveValueForKey:@"<#Relationship name#>"] addObject:value]; 
    [self didChangeValueForKey:@"<#Relationship name#>" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 
    [changedObjects release]; 
} 

,你需要更換< #Capitalized關係名稱#>,< #Relationship目標類#>和< #Relationship名稱#>,然後添加您的自定義代碼。 (因爲我正在使用ARC,所以我也必須刪除[changedObjects發佈]。)

+2

小心這種方法。自從我發佈這個答案以來,我遇到了一些刪除方法實際上並沒有刪除對象的問題。當我刪除該方法並將自定義代碼移至調用級別時,它再次運行。我現在懷疑蘋果可能不會保持這些代碼片段的最新狀態,並且這樣做可能是一個壞主意。 – Symmetric 2012-08-15 01:01:43