2

NSValueTransformer を使用して、いくつかのコア データ列を暗号化したい。アイデアは、データ型変換可能を使用し、データ型のトランスフォーマーを定義することです。変換メソッド内で、値を暗号化/復号化したい。実際には何もしないトランスフォーマーを定義しました-暗号化は現在実装されていません。

@implementation StringCryptoTransformer

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


+ (BOOL)allowsReverseTransformation { return YES; }


- (NSString*)transformedValue:(id)value {

    NSLog(@"Transformer: %@",value);

    if([value isKindOfClass:[NSString class]]){
        return value;
    }
    return nil;
}     

- (NSString*)reverseTransformedValue:(id)value
{
    return value;
}

方法

- (NSString*)transformedValue:(id)value

有効な値で呼び出されますが、オブジェクトをフェッチすると、次のエラーが発生します。

*キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '-[__NSCFString バイト]: 認識されないセレクターがインスタンス 0xf5859f0 に送信されました'

何が間違っているのですか?

編集:

NSData に変換する必要があり、その逆も必要であることに気付きました。今では正常に動作します

- (id)transformedValue:(id)value {

    NSData *data =  [((NSString*)value) dataUsingEncoding:NSUTF8StringEncoding];
    return [CryptoUtils encryptWithKey:self.key data:data];
}


- (id)reverseTransformedValue:(id)value
{
    NSData *data = [CryptoUtils decryptWithKey:self.key data:value];
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
4

1 に答える 1

5

に変換する必要があることに気付きましたNSData。今では正常に動作します

- (id)transformedValue:(id)value {

    NSData *data =  [((NSString*)value) dataUsingEncoding:NSUTF8StringEncoding];
    return [CryptoUtils encryptWithKey:self.key data:data];
}    

- (id)reverseTransformedValue:(id)value
{
    NSData *data = [CryptoUtils decryptWithKey:self.key data:value];
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
于 2012-05-21T19:20:38.627 に答える