我有一个简单的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
在使用调试器时永远不会被“触及”。
答案 0 :(得分: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];
答案 1 :(得分:-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;
}
}