2012-02-29 36 views
2

単純なNSValueTransformerがあり、コンマで区切られた文字列first, second, thirdを配列に変換する必要があります。だから私のCoreDataスキーマで私はTransformedに設定し、私の変圧器を指定する属性optionsを持っています。CoreDataは配列を返すときに文字列を返します。文字列を返すときにNSDataを返します。

これは私の変圧器である:私はテストを返す場合

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

:私は変数resultを返すとき

-(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"; 
    } 
} 

は今、私は次のエラーを(それがNSStringを期待しているようlengthが見えます)を取得上記の文字列の代わりにこのエラーが発生します(bytesNSDataオブジェクトを予期しているようです):

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

私は把握していないような概念上の問題があるようです。また、興味深いことに、+(Class)transformedValueClass+(BOOL)allowsReverseTransformationは、デバッガを使用するとき決して「触れられません」。

答えて

2

は、あなたが提供するコードでは、エラーはありませんしようとNSStringのにキャストする必要があります。この問題はCoreDataアプローチにあります。

CoreDataで変換プロパティを使用する場合、その値はデータベースにNSDataオブジェクトとして格納されます。エラーの長さはNSDataの長さのメソッドに関連しています。

したがって、NSDataからNSArrayへの変換をNSValueTransformerに提供し、連結された配列をCoreDataにNSDataとして配置する必要があります。

プロパティをNSStringとして保存する可能性がある場合は、NSStringをNSArray値に変換するか、CoreDataモデルの外でNSValueTransformerを次のように使用して、管理対象オブジェクトのNSStringプロパティに特別なアクセサを実装できます。

+0

しかし、 "1"から "10"までの数字を1から10の数字に変換するトランスフォーマを作成できませんでしたか?それはNSDataでなければなりませんか? – Besi

+0

Objective-CオブジェクトだけがCoreDataに格納できることを考慮してください。したがって、NSNumber、NSDate、NSStringまたはNSData以外の数字はありません。私はあなたにアドバイスを与えることを主な目標として理解できません。しかし、エンティティにいくつかの文字列を追加するために、モデルにいくつかの追加のオブジェクトを追加し、一対多を関連させることをお勧めします。それはよりエレガントで効果的なソリューションかもしれません。 – voromax

-1

値は、この

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

    } 
} 
+0

負の値ですが、私はまだ結果が実際にデバッガで期待していた配列であることを確認しました。NSString * languages = value;は暗黙のキャストです言語はNSString *型です。 – Besi

関連する問題