2014-03-03 109 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 –