2014-03-03 30 views
1

作爲一名完整的可口可樂初學者,我需要幫助對核心數據實體進行計算。 我們假設實體有3個屬性a,b和c。通過表格視圖在覈心數據實體中計算

當C = A * B

當我改變了在表視圖,我想C到重新計算列A,B和C項。

到目前爲止,我已經從NSArrayController中分類了一個數組控制器myArrayController,並將它設置爲身份檢查器中的自定義類。

在QT中,如果單元格發生變化,我可以使用表格視圖發出的信號。我如何在可可中做到這一點? 如果我控制拖動一個按鈕並創建一個動作,當點擊按鈕時顯然會觸發它。 但是用文本字段單元...? 如何在列a中的值已更改時計算c? (我的第一個想法是按住ctrl拖動一個動作到數組控制器中;但說實話我沒有足夠好的理解這些機制,並且在書中找不到一個合適的例子來判斷我是否朝着錯誤的方向前進)

+0

你對我的回答有任何問題嗎? –

+0

看看更新的答案。 –

回答

0

基於傑克納丁和彼得·克拉克的第8章,186頁「在Mac上了解可可」我發現了以下解決方案:

我刪除屬性c從可可模型,並創建了一個managedObject子類。 在這種suclass我不得不實施2種的附加方法:

- (double) c 
{ 
    double c = [[self valueForKey:@"a"] doubleValue] *[[self valueForKey:@"b"] doubleValue]] ; 

    return c; 
} 

+ (NSSet *)keyPathsForValuesAffectingC { 

    return [NSSet setWithObjects:@"a", @"b", nil]; 
} 

則綁定「文本字段細胞 - 表視圖細胞」,以「表格單元格視圖」(而不是陣列控制器,如在書所描述的) 。

你應該很好去。 :-)

我試了一下,可以驗證它的工作。 但是,由於奧列格我走上了正軌,我相信他的解決方案也有其好處。 再次感謝!

0

起初:在實體類

@implementation Entity 

@dynamic a; 
@dynamic b; 
@dynamic c; 

-(NSNumber*) c 
{ 
    return [NSNumber numberWithDouble:[self.a floatValue]*[self.b integerValue]]; 
} 

-(void)didChangeValueForKey:(NSString *)key 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"needSave" object:self]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"needUpdate" object:self]; 
    [super didChangeValueForKey:key]; 
} 

@end 

在你的控制器,你應該在didLoad方法或在applicationDidFinishLaunching添加此

覆蓋存取方法,如果它是一個的appDelegate:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updateTables) 
              name:@"needUpdate" 
              object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(save) 
              name:@"needSave" 
              object:nil]; 

-(void)updateTables 
{ 
    [table reloadData]; 
} 

-(void)save 
{ 
    NSError *err = nil; 
    [self.managedObjectContext save:&err]; 
} 

因此,當陣列控制器將訪問c屬性時,她將重新計算。但不要忘記設置Transient屬性c屬性屬性檢查器的xcdatamodel。

enter image description here

而且你不應該使用setC:方法。

二:

你不應該寫NSArrayController的子類與自定義實體的工作。

+0

感謝您的提示!我收集我需要從實體創建一個類。我發現這些指令可以直接從模型中完成。這本書是德文的,所以我不會在這裏複製文字。但如果你點擊「編輯器」有「創建NSManagedObject子類」謝謝...我一直試圖 – RogerWilco77

+0

按cmd + n,然後選擇「核心數據」項,然後managedObject子類@ RogerWilco77 –

+0

如果你有解決你的問題,你可以接受我的回答。如果你需要其他的東西,請告訴。 @ RogerWilco77 –