开发者

How do I represent a “none” value in NSUserDefaults?

I am storing keyboard shortcuts represented as NSDictionary instances into user defaults and have some trouble representing “none” values. When my application starts I register some default shortcuts. Then the user may change keyboard shortcuts in application preferences. The keyboard setting widgets are bound directly to user defaults.

The user may click a special “clear” button that clears a keyboard shortcut, meaning that user does not wish to set a shorcut f开发者_如何学Pythonor given feature. When the keyboard shortcut is cleared, it’s set to nil. This is a problem, because setting the shortcut to nil in user defaults reverts the value to the one registered with registerDefaults:. (The objectForKey: method does not find given key in the app domain and therefore goes into the NSRegistrationDomain domain.)

How should I represent the “cleared” keyboard shortcuts so that objectForKey: returns nil? Do I have to play games with empty NSDictionary instances and other sentinel values, or is there a better way?


I ended up using this transformer:

@interface NullTransformer : NSValueTransformer {}
@end

@implementation NullTransformer

+ (BOOL) allowsReverseTransformation {
    return YES;
}

- (id) transformedValue: (id) value {
    return [value count] ? value : nil;
}

- (id) reverseTransformedValue: (id) value {
    return value ? value : [NSDictionary dictionary];
}

@end

In other words, I use an empty dictionary to represent unset values and convert between this special value and nil using a custom transformer so that my classes don’t have to care. It’s not perfect, but seems like a tolerable solution.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜