Xcode 核心数据:可转换属性';s属性未被更新

Xcode 核心数据:可转换属性';s属性未被更新,xcode,macos,cocoa,core-data,cocoa-bindings,Xcode,Macos,Cocoa,Core Data,Cocoa Bindings,我有一个CoreData模型,它作为成员具有非标准属性。因此,我有一个子类NSValueTransformer将对象转换为NSData并返回。此成员有2个NSNumber类型的属性。。。我使用标准属性声明实现它们,并让编译器合成它们的访问器,因此我假设所有内容都符合KVC 如果我尝试将max或min绑定到NSTextCell(是的,NSTextCell上有一个数字格式化程序),我可以编辑这些值,认为发生了什么事情,但当我保存managedObjectContext并重新启动应用程序时,只会显示这

我有一个CoreData模型,它作为成员具有非标准属性。因此,我有一个子类NSValueTransformer将对象转换为NSData并返回。此成员有2个NSNumber类型的属性。。。我使用标准属性声明实现它们,并让编译器合成它们的访问器,因此我假设所有内容都符合KVC

如果我尝试将max或min绑定到NSTextCell(是的,NSTextCell上有一个数字格式化程序),我可以编辑这些值,认为发生了什么事情,但当我保存managedObjectContext并重新启动应用程序时,只会显示这些对象的初始值

在该属性的CoreData模型(称为timeRange)中,我将他的值转换器设置为正确的值,但绑定似乎只在一个方向上工作。我似乎无法编辑这些值,让它们返回模型

相比之下,具有timeRange属性的对象也有一个简单的number属性(因为我希望确保修改number属性的机制能够正常工作),并且这些更改会传播到持久性存储

问题是,我做错了什么?我的实现可能缺少什么?我假设,一旦在非标准属性上指定了值转换器(在该属性的核心数据模型编辑器中),就可以在其他任何地方使用该属性,就好像它是假定的一样,在本例中是SCTimeRange,而不是NSData

所以,如果这是真的,并且我的模型有一个SCTimeRange类型的属性,为什么我不能设置它非常简单的NSNumber属性呢?这是否与NSTextCell上的数字格式化程序未绑定到任何其他内容有关?i、 专栏不知道吗

@interface SCTimeRange : NSObject <NSCoding>

@property (nonatomic, strong) NSNumber *max;
@property (nonatomic, strong) NSNumber *min;

@end

@implementation SCTimeRange
- (id)init
{
    self = [super init];
    if (self) {
        self.max = @(0.0f);
        self.min = @(0.0f);
    }
    return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.max = [aDecoder decodeObjectForKey:@"max"];
        self.min = [aDecoder decodeObjectForKey:@"min"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder

    [aCoder encodeObject: self.max forKey:@"max"];
    [aCoder encodeObject: self.min forKey:@"min"];
}
@end

只是为了让我能更了解一点:为什么要转换为NSData,而反向转换为SCTimeRange?您是将NSData对象存储到核心数据并尝试将其用作SCTimeRange,还是将SCTimeRange存储在核心数据中并尝试使用NSData对象?在反向转换中,传递的值将是使用SCTimeRange的NSData对象。因此,您对SCTimeRange的内省失败,因此返回nil。按照我对可转换属性的理解,NSValueTransformer的transformedValueClass必须是NSData,这表明transformedValue中的返回值必须是NSData,因此,这必须是您转换的数据类型,在本例中,SCTimeRange。是另一条路吗?我在这里设置了断点,它永远不会返回nil,而且我从来没有得到“预期不同类型”的异常。它显示数据,但无法进行设置。
@implementation SCTimeRangeTransformer

+(Class)transformedValueClass {
    return [NSData class];
}

+ (BOOL)allowsReverseTransformation { return  YES; }

-(id)transformedValue:(id)value {
    if (value == nil) {
        return nil;
    } else if ([value isKindOfClass:[NSData class]]){

        NSData *data = (NSData*)value;
        return data;
    }
    else if ([value isKindOfClass:[SCTimeRange class]])
    {
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject: (SCTimeRange*)value];   
        return data;

    }

    return nil;
}

- (id)reverseTransformedValue:(id)value
{
    if (value == nil) {
        return nil;
    }
    else if ([value isKindOfClass:[SCTimeRange class]])
    {
        return value;
    }
    else if ([value isKindOfClass:[NSData class]]){

        NSData *data = (NSData*)value;
        SCTimeRange *range = (SCTimeRange*)[NSKeyedUnarchiver unarchiveObjectWithData: data];

        return range;
    }
    return nil;
}

@end