2

我有一个简单NSValueTransformer的应该将逗号分隔的字符串first, second, third转换为数组的方法。所以在我的 CoreData 模式中,我有options我设置Transformed并指定我的 Transformer 的属性。

这是我的变压器:

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        // return result;
        return @"test Result";
    }
}

现在,当我返回变量时,result我收到以下错误(length看起来像是期待一个NSString):

... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0'

如果我返回上面的测试字符串,则会收到此错误(bytes看起来它需要一个NSData对象):

... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780'

看起来有一个我似乎没有掌握的概念问题。也很奇怪+(Class)transformedValueClass+(BOOL)allowsReverseTransformation在使用调试器时永远不会“触动”。

4

2 回答 2

2

您提供的代码没有错误。问题在于您的 CoreData 方法。

当您在 CoreData 中使用转换后的属性时,该值将作为NSData对象存储在数据库中。您的错误中的长度与NSData 长度方法有关。

因此,您应该为 NSValueTransformer 提供从 NSData 到 NSArray 的转换,并反向将串联数组作为 NSData 放入 CoreData。

如果您想保留将属性存储为 NSString 的可能性,您可以实现对托管对象的 NSString 属性的特殊访问器,这会将 NSString 转换为 NSArray 值,或者在 CoreData 模型之外使用 NSValueTransformer,如下所示:

NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];
于 2012-02-29T20:15:10.717 回答
-1

该值需要转换为 NSString 试试这个

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = (NSString*)value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        return result;

    }
}
于 2012-02-29T17:39:58.280 回答