代码之家  ›  专栏  ›  技术社区  ›  RogerWilco77

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

  •  1
  • RogerWilco77  · 技术社区  · 11 年前

    作为一个完全的可口可乐初学者,我需要帮助来计算核心数据实体。 假设实体有3个属性,a、b和c。

    其中c=a*b

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

    到目前为止,我已经将NSArray controller中的一个数组控制器myArrayController进行了子分类,并将其设置为身份检查器中的自定义类。

    在QT中,我可以处理表格视图发出的信号,以防单元格发生更改。我在可可怎么做? 如果我控制拖动一个按钮并创建一个动作,那么当单击该按钮时,它显然会被触发。 但使用文本字段单元格。。。? 当a列中的值已更改时,如何计算c? (我的第一个想法是用ctrl将一个动作拖到阵列控制器中;但老实说,我对这个机制理解不够,在书中找不到合适的例子来判断我是否朝着错误的方向前进)

    2 回复  |  直到 11 年前
        1
  •  0
  •   Oleg Sobolev    11 年前

    起初:

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

    @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方法或applicationDidFinishLaunching中:

    [[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: 方法

    第二:

    您不应该为使用自定义实体编写NSArray Controller的子类。

        2
  •  0
  •   RogerWilco77    11 年前

    根据杰克·努廷和彼得·克拉克的《在Mac上学习可可》第8章第186页,我找到了以下解决方案:

    我从可可模型中删除了属性c,并创建了managedObject子类。 在这个suclass中,我必须实现两个额外的方法:

    - (double) c
    {
        double c = [[self valueForKey:@"a"] doubleValue] *[[self valueForKey:@"b"] doubleValue]] ;
    
        return c;
    }
    
    + (NSSet *)keyPathsForValuesAffectingC {
    
        return [NSSet setWithObjects:@"a", @"b", nil];
    }
    

    然后将“文本字段单元格-表视图单元格”绑定到“表单元格视图”(而不是本书中描述的数组控制器)。

    你应该很乐意去。:-)

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