我有一个带有NSPopupButton的CoreData / SQLite应用程序,它显示某些实体属性(整数)的可能值。它会自动显示数据库中的属性值。用户必须能够分配另一个值,以便我的代码在启动时生成所有可能值的数组。在我的XIB中,我有一个用于按钮的NSObject和一个用于可能值的NSArrayController。绑定已经完成,一切正常。
当然,对于用户来说,仅使用数字并不清楚,因此我创建了一个值变换器,用弹出按钮上的单词替换数字:1 =>红色,2 =>绿色,3 =>蓝色。
问题是只有选定的Popup项被单词替换。当我使用弹出按钮选择另一个值来修改实体属性时,它不会保存它。我通过在TableView中选择另一个对象然后返回修改后的对象来看到它,Popup将指示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
答案 0 :(得分:0)
我正在审核我的问题,看到这个问题没有得到答复。然而与此同时,我找到了我现在发布的答案,这样可以帮助其他人。
我做的错误是定义整数值数组,而我应该做的是定义填充弹出按钮的单词数组。这是完整的解决方案:
标题文件:
#import <Cocoa/Cocoa.h>
@interface ColorOption : NSArrayController {
IBOutlet NSPopUpButton *colorPopup;
NSArray *theNames;
}
@property (strong) NSPopUpButton *colorPopup;
@property (readwrite, copy) NSArray *theNames;
@end
@interface StatusTransformer : NSValueTransformer {
}
@end
实施档案
#import "ColorOption.h"
@implementation ColorOption
@synthesize colorPopup = _colorPopup;
@synthesize theNames = _theNames;
-(void)awakeFromNib {
[self setTheNames:[NSArray arrayWithObjects:[NSString stringWithFormat:@"Red"],[NSString stringWithFormat:@"Green"],[NSString stringWithFormat:@"Blue"],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 nil;
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
现在在Xcode的绑定检查器中,必须将值转换器应用于弹出按钮的“内容值”和“选定对象”。