0

いくつかのエンティティ属性 (整数) の可能な値を示す NSPopupButton を備えた CoreData/SQLite アプリがあります。データベース内の属性値が自動的に表示されます。ユーザーは別の値を割り当てることができる必要があるため、コードは起動時にすべての可能な値の配列を生成します。私の XIB には、ボタン用の NSObject と可能な値用の NSArrayController があります。バインディングが完了し、すべて正常に動作します。

もちろん、数字だけを使用することはユーザーにとって明確ではないため、ポップアップ ボタンの数字を単語に置き換える値変換プログラムを作成しました: 1=>赤、2=>緑、3=>青。

問題は、選択されたポップアップ項目だけが単語に置き換えられることです。また、エンティティ属性を変更するためにポップアップ ボタンで別の値を選択すると、それは保存されません。TableView で別のオブジェクトを選択してから変更したオブジェクトに戻ると、ポップアップが NoValue を示します。

理由がわかりません。ご協力ありがとうございました。

ヘッダー ファイル「ColorOption.h」のコードは次のとおりです。

#import <Foundation/Foundation.h>

@interface ColorOption : NSArrayController {
    IBOutlet NSPopUpButton *colorPopup;
    NSArray *theNumbers;
}
@property (retain) NSPopUpButton *colorPopup;
@property (readwrite, copy) NSArray *theNumbers;
@end

@interface StatusTransformer : NSValueTransformer {
}
@end

実装ファイル「ColorOption.m」のコードは次のとおりです。

#import "ColorOption.h"

@implementation ColorOption
@synthesize colorPopup;
@synthesize theNumbers;

-(void)awakeFromNib {
    [self setTheNumbers:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],[NSNumber numberWithInt:3],nil]];
    StatusTransformer *statusTrans = [[[StatusTransformer alloc] init] autorelease];
    [NSValueTransformer setValueTransformer:statusTrans forName:@"StatusTransformer"];
}
@end

@implementation StatusTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return YES; }
- (id)transformedValue:(id)value {
    switch ([value intValue]) {
        case 1:
        return @"Red";
        break;
        case 2:
        return @"Green";
        break;
        case 3:
        return @"Blue";
        break;
        default:
        return @"";
        break;
    }
}

-(id)reverseTransformedValue:(id)value {
    if ([@"Red" isEqualToString:value]) return [NSNumber numberWithInt:1];
    if ([@"Green" isEqualToString:value]) return [NSNumber numberWithInt:2];
    if ([@"Blue" isEqualToString:value]) return [NSNumber numberWithInt:3];    
    return nil;
}

@end
4

1 に答える 1