開発メモ

開発関係のメモをいろいろと。たぶん。

NSValueTransformerの使い方

NSArrayControllerを使う場合、テーブルビューに表示する形式は対応するメソッドさえ用意すれば簡単に変更できます。が、同じような処理を何回も書くのは面倒なので、NSValueTransformerで簡単に変換できるようにしてみます。

動作を確認した環境

環境 情報
OS X 10.9.2
Xcode 5.1
Date 2014/03/31

使い方

内部ではBOOLで保持してる値を、『YES』『NO』の文字列で表示するような変換を作成します。

1. NSValueTransformerの派生クラスを作成

こんな感じのクラスになります。

@interface SK4BoolStringTransformer : NSValueTransformer
+ (Class)transformedValueClass;
+ (BOOL)allowsReverseTransformation;
+ (void)registTransformer;
@end

transformedValueClassとallowsReverseTransformationは必須。registTransformerは自分が手を抜くために作った関数です。

2. 情報を返す関数を実装

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

+ (BOOL)allowsReverseTransformation
{
    return YES;
}

transformedValueClassは変換後のクラスを返します。allowsReverseTransformationは逆変換が可能な場合YESを、そうでない場合はNOを返します。

3. 実際の変換処理を実装

変換元になるオブジェクトは中身がわからないので、必要なメソッドが使える場合だけ変換するように実装してます。

- (id)transformedValue:(id)value
{
    if( value == nil )
        return nil;

    BOOL flag = NO;
    if( [value respondsToSelector:@selector(boolValue)] )
        flag = [value boolValue];

    if( flag )
        return @"Yes";
    else
        return @"No";
}

- (id)reverseTransformedValue:(id)value
{
    if( value == nil )
        return nil;

    BOOL flag = NO;
    if( [value respondsToSelector:@selector(compare:options:)] ) {
        if( [value compare:@"Yes" options:NSCaseInsensitiveSearch] == NSOrderedSame )
            flag = YES;
    }

    return @(flag);
}

4. 変換処理を登録して使えるようにする

登録処理はこんな感じで。

static BOOL g_regsiter = NO;

+ (void)registTransformer
{
    if( g_regsiter )
        return;

    SK4BoolStringTransformer* tra = [[SK4BoolStringTransformer alloc] init];
    [NSValueTransformer setValueTransformer:tra forName:@"SK4BoolStringTransformer"];

    g_regsiter = YES;
}

この関数をAppDelegateのinitializeで呼び出します。

+ (void)initialize
{
    [SK4BoolStringTransformer registTransformer];
}

5. 変換処理を指定

バインディングタブで変換処理を指定します。

f:id:see_ku:20140331194536p:plain

簡単だね。

備考

実装例

See_Ku / Minerba — Bitbucket
https://bitbucket.org/See_Ku/minerba

参考資料

NSValueTransformer Class Reference
https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSValueTransformer_Class/Reference/Reference.html