У меня есть приложение CoreData/SQLite с NSPopupButton, представляющим возможные значения для некоторого атрибута объекта (целое число). Он автоматически показывает значение атрибута в базе данных. Пользователь должен иметь возможность присвоить другое значение, поэтому мой код генерирует массив всех возможных значений при запуске. В моем XIB у меня есть NSObject для кнопки и NSArrayController для возможных значений. Привязки сделаны, все работает.
Конечно, использование только чисел не понятно пользователю, поэтому я создал преобразователь значений, чтобы заменить числа словами на всплывающей кнопке: 1=>Красный, 2=>Зеленый, 3=>Синий.
Проблема в том, что только выбранный элемент Popup заменяется словом. И когда я выбираю другое значение с помощью кнопки «Всплывающее окно», чтобы изменить атрибут объекта, оно не сохраняет его. Я вижу это, выбирая другой объект в 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