【问题标题】:Change an entity attribute displayed in a table through an Array Controller通过数组控制器更改表中显示的实体属性
【发布时间】:2013-06-21 02:22:14
【问题描述】:

我有一组通过 Array 控制器(所有绑定)显示在 Tableview 中的属性,我编写了一些代码来根据其他属性的内容更改其中一个属性。我在 Core data 为这个实体创建的 .m 文件中写了这个:

标题:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Instrument;

@interface IO : NSManagedObject

@property (nonatomic, retain) NSNumber * channel;
@property (nonatomic, retain) NSString * depiction;
@property (nonatomic, retain) NSString * prefix;
@property (nonatomic, retain) NSNumber * rack;
@property (nonatomic, retain) NSNumber * slot;
@property (nonatomic, retain) NSString * suffix;
@property (nonatomic, retain) NSString * tag;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * depictionFull;
@property (nonatomic, retain) Instrument *io_instrument;

@end

主要:

#import "IO.h"
#import "Instrument.h"
#import "Loop.h"
#import "Area.h"


@implementation IO {
}

@dynamic channel;
@dynamic depiction;
@dynamic prefix;
@dynamic rack;
@dynamic slot;
@dynamic suffix;
@dynamic tag;
@dynamic type;
@dynamic depictionFull;
@dynamic io_instrument;

- (void)awakeFromFetch{

    [self setDepictionFull:[NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction]];
}

@end

这里有两个问题:

  1. 这只会更改我的属性的表“视图”值,但不会更改实际保存的值(我知道这一点,因为当我注释掉代码时,值不会被保存)

  2. 我使用的“awakeFromFetch”函数仅在获取数据时应用代码,但我也希望在更改实体(或数组控制器)中的任何属性时刷新它。

【问题讨论】:

    标签: xcode core-data attributes nsarraycontroller


    【解决方案1】:

    最好的方法不是保存值depictionFull,而是在请求时返回它。

    - (NSString *)dipictionFull {
        return [NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction];
    }
    

    这样它总是会返回最新的值,无论如何!它以一种懒惰的方式运行,iOS 和 Objective-c 往往可以很好地使用它。当属性或属性完全依赖于其他属性或属性时,这[通常]不是一个坏主意。

    就不保存而言: 我猜该值显示正确并且没有被保存,因为您没有明确保存它。

    最后, 您不应该将此代码放入实际的 NSManagedObject 子类中。如果你添加一个属性并且需要重新创建这个类怎么办?然后(如果您使用 XCodes 创建工具)它将完全清除您的自定义 awakeFromFetch。而是为IO 创建一个category 并将您的自定义代码放在那里。然后,如果您需要重新创建 NSManagedObject 实现,您的类别将保持不变。

    更新 - 如何使用类别

    要创建一个类别,请转到 file -> new -> file(或 command+N),然后在 Cocoa 下触摸选择Objective-C类别。将您的类别命名为 AddOn(或类似名称)并在 Category on 下放置您的 NSManagedObject 的子类(在本例中为 Instrument)。之后,将方法-(NSString *)dipictionFull; 放在.h 中,将上述实现放在.m 中。然后当你想使用这个方法时,在需要dipictionFull的类中导入Instrument+AddOn.h。然后只需调用它[self.myInstrument dipictionFull],您就会得到始终保持最新状态的字符串,因为它每次都会实时提取值。

    【讨论】:

    • 我了解使用上述功能的价值,但我的问题是知道我在哪里请求它。另外,我如何明确保存一些东西?我将代码放在该对象中的原因是因为我发现它是唯一更改表中所有相应值的地方。抱歉,我对这种编程很陌生:)
    • @Canto 我在回答中添加了一些信息,看看是否对您有帮助。我不完全确定你在问什么,所以我只是猜测。
    • 谢谢菲罗!我已经做出了您推荐的更改: - 将代码移动到单独的 Object 类 - 能够应用/保存对我的属性的更改,但只能对一个属性进行更改。无法将更改应用于实体中的所有相同属性。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多