2

NSValueTransformerコンマ区切りの文字列first, second, thirdを配列に変換する単純なものがあります。したがって、CoreData スキーマには、Transformeroptionsに設定しTransformedて指定する属性があります。

これは私のトランスフォーマーです:

-(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 への変換を提供し、逆に連結配列を CoreData に NSData として配置する必要があります。

プロパティを 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 に答える