NSValueTransformers can be extremely useful, especially when one wishes to make heavy use of bindings in Interface Builder. This facility is typically used to modify values displayed by a control in a declarative way. The following example illustrates a simple NSValueTransformer subclass that does nothing more than chops away a file extension from a string.
@interface QCChopAwayExtensionValueTransformer: NSValueTransformer {}
@end
@implementation QCChopAwayExtensionValueTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
if (value == nil) return nil;
return [value stringByDeletingPathExtension];
}
+(void) initialize
{
NSString *name = @"QCChopAwayExtensionValueTransformer";
[[NSValueTransformer class] setValueTransformer:[self new]
forName:name];
}
@end
@end
@implementation QCChopAwayExtensionValueTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
if (value == nil) return nil;
return [value stringByDeletingPathExtension];
}
+(void) initialize
{
NSString *name = @"QCChopAwayExtensionValueTransformer";
[[NSValueTransformer class] setValueTransformer:[self new]
forName:name];
}
@end
In order to make use of the subclass in IB it needs to be registered by name with the system as is done in the above code example. Once registered a transformer can be used inside, say, a table column as shown below.
