У меня есть приложение CoreData / SQLite с NSPopupButton, представляющее возможные значения для некоторого атрибута сущности (целое число).Он автоматически показывает значение атрибута в базе данных.Пользователь должен иметь возможность назначить другое значение, чтобы мой код генерировал массив всех возможных значений при запуске.В моем 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