Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过表视图在核心数据实体中计算_Objective C_Cocoa_Cocoa Bindings - Fatal编程技术网

Objective c 通过表视图在核心数据实体中计算

Objective c 通过表视图在核心数据实体中计算,objective-c,cocoa,cocoa-bindings,Objective C,Cocoa,Cocoa Bindings,作为一名完全的Coca初学者,我需要帮助对核心数据实体进行计算。 让我们假设实体有3个属性,a、b和c 其中c=a*b 当我在表视图中用a、b和c列更改a的条目时,我希望重新计算c 到目前为止,我已经从NSArrayController中对一个数组控制器myArrayController进行了子分类,并将其设置为identity inspector中的自定义类 在QT中,我可以使用表视图发出的信号,以防单元格发生变化。我用可可怎么做? 如果我控制拖动一个按钮并创建一个动作,当单击按钮时,它显然会

作为一名完全的Coca初学者,我需要帮助对核心数据实体进行计算。 让我们假设实体有3个属性,a、b和c

其中c=a*b

当我在表视图中用a、b和c列更改a的条目时,我希望重新计算c

到目前为止,我已经从NSArrayController中对一个数组控制器myArrayController进行了子分类,并将其设置为identity inspector中的自定义类

在QT中,我可以使用表视图发出的信号,以防单元格发生变化。我用可可怎么做? 如果我控制拖动一个按钮并创建一个动作,当单击按钮时,它显然会被触发。 但是有一个文本字段单元格。。。? 当a列中的值发生变化时,如何计算c? 我的第一个想法是按住ctrl键将动作拖动到数组控制器中;但老实说,我还没有很好地理解这些机制,也没有在书中找到合适的例子来判断我是否朝着错误的方向前进

重写实体类中的访问器方法

@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
在控制器中,如果是appDelegate,则应在didLoad方法或ApplicationIDFinishLaunching中添加以下内容:

[[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属性时,她将重新计算。但不要忘记在xcdatamodel的属性检查器中为c属性设置瞬态属性

而且永远不要使用setC:method

第二:


您不应该编写NSArrayController的子类来处理自定义实体。

基于Mac第8章第186页的Jack Nutting和Peter Clark的Learn Cocoa,我找到了以下解决方案:

我从cocoa模型中删除了属性c,并创建了managedObject子类。 在这一类中,我必须实现另外两种方法:

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

    return c;
}

+ (NSSet *)keyPathsForValuesAffectingC {

    return [NSSet setWithObjects:@"a", @"b", nil];
}
然后将文本字段cell-table view单元格绑定到table cell视图,而不是数组控制器,如本书所述

你应该可以走了-

我试过了,可以验证它是否有效。 但多亏了奥列格,我走上了正确的道路,我相信他的解决方案也有它的好处。
再次感谢

你对我的答案有什么问题吗?看看更新的答案。谢谢你的提示!我想我需要从实体创建一个类。我发现可以直接从建模师那里完成这项工作。这本书是德语的,所以我不会在这里抄写。但如果您单击编辑器,则会创建NSManagedObject子类,谢谢。。。我一直在尝试按cmd+n,然后选择核心数据项,然后选择managedObject subclass@rogerwilco77。如果您得到了问题的解决方案,您可以接受我的答案。如果你还需要什么,就告诉我@RogerWilco77Hi,只有当我在c列中写了一些新内容时,更新才有效,但当我更改a或b时,更新就无效了。我有我自己的应用程序,在那里我使用的代码就像在我的帖子里一样,他工作得很好。告诉我更多,你到底在做什么?如何将实体连接到阵列控制器,如何将tableview行连接到控制器,是否在连接到实体a、b、c的tableview行单元格中使用nsformatter@RogerWilco77