首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreData整数属性上NSPopupButton的NSValueTransformer

CoreData整数属性上NSPopupButton的NSValueTransformer
EN

Stack Overflow用户
提问于 2011-09-10 02:01:00
回答 1查看 879关注 0票数 0

我有一个CoreData/SQLite应用程序,它有一个NSPopupButton,它显示了一些实体属性(一个整数)的可能值。它会自动显示数据库中的属性值。用户必须能够分配另一个值,以便我的代码在启动时生成一个包含所有可能值的数组。在我的XIB中,我有一个按钮的NSObject和一个可能值的NSArrayController。绑定已经完成,一切工作正常。

当然,对于用户来说,仅使用数字并不是很清楚,所以我创建了一个值转换器来将弹出按钮上的数字替换为单词: 1=>Red、2=>Green、3=>Blue。

问题是只有选定的弹出项才会被单词替换。当我用弹出按钮选择另一个值来修改实体属性时,它不会保存它。我通过在TableView中选择另一个对象来查看它,然后返回到修改后的对象,弹出窗口将显示NoValue。

我不明白为什么。谢谢你的帮助。

以下是头文件“ColorOption.h”的代码:

代码语言:javascript
复制
#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的代码如下:

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

发布于 2012-08-04 22:27:12

我正在检查我的问题,发现这个问题没有得到回答。然而,在此期间,我已经找到了答案,我现在就把它贴出来,这样可能会对其他人有所帮助。

我所做的错误是定义了整数值的数组,而我应该做的是定义了填充弹出按钮的单词数组。以下是完整的解决方案:

头文件:

代码语言:javascript
复制
#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

实现文件

代码语言:javascript
复制
#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的绑定检查器中,必须将值转换器应用于弹出按钮的"Content Values“和"Selected Object”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7365609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档