作为一个完整的Coca初学者,我需要帮助来对核心数据实体进行计算。 假设实体有3个属性,a,b和c。
其中c = a * b
当我在表格视图中使用a,b和c列更改a的条目时,我希望重新计算c。
到目前为止,我已经从NSArrayController中对数组控制器myArrayController进行了子类化,并将其设置为身份检查器中的自定义类。
在QT中,我可以使用表视图发出的信号,以防更改单元格。我怎么在Cocoa中做到这一点? 如果我控制 - 拖动按钮并创建动作,则在单击按钮时显然会触发该动作。 但是使用Text Field Cell ......? 当a列中的值发生变化时,如何计算c? (我的第一个想法是将一个动作拖动到数组控制器中;但说实话,我还没有很好地理解这些机制,并且无法在书中找到一个合适的例子来判断我是否朝着错误的方向前进)< / p>
答案 0 :(得分: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
属性时,她将重新计算。但请不要忘记在xcdatamodel的属性检查器中为Transient
属性设置c
属性。
你永远不应该使用setC:
方法。
第二
您不应该编写NSArrayController的子类来处理自定义实体。
答案 1 :(得分:0)
基于Jack Nutting和Peter Clark的“在Mac上学习可可”第8章第186页,我找到了以下解决方案:
我从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];
}
然后将“文本字段单元格 - 表格视图单元格”绑定到“表格单元格视图”(而不是数组控制器,如本书所述)。
你应该好好去。 : - )
我试过了,可以验证它是否有效。 但是感谢Oleg我走上正轨,我相信他的解决方案也有其优点。 再次感谢!