Если вы привыкли к привязкам, то я бы порекомендовал взглянуть на NSValueTransformer; в частности, создание подкласса того, который преобразует значение приоритета в строку восклицательных знаков. Затем вы просто указали бы имя (то же самое, которое использовалось в +setValueTransformer:forName:
) в качестве атрибута «преобразователь значения» в ваших привязках.
Например, код будет выглядеть так:
@interface PriorityTransformer : NSValueTransformer
@end
@implementation PriorityTransformer
+ (Class) transformedValueClass { return ( [NSString class] ); }
+ (BOOL) allowsReverseTransformation { return ( NO ); }
- (id) transformedValue: (id) value
{
// this makes the string creation a bit simpler
static unichar chars[MAX_PRIORITY_VALUE] = { 0 };
if ( chars[0] == 0 )
{
// ideally you'd use a spinlock or such to ensure it's setup before
// another thread uses it
int i;
for ( i = 0; i < MAX_PRIORITY_VALUE; i++ )
chars[i] = (unichar) '!';
}
return ( [NSString stringWithCharacters: chars
length: [value unsignedIntegerValue]] );
}
@end
Затем вы поместите этот код в тот же файл, что и центральный класс (например, делегат приложения), и зарегистрируете его с помощью метода +initialize
этого класса, чтобы убедиться, что он зарегистрирован вовремя для любых перьев, чтобы найти его:
+ (void) initialize
{
// +initialize is called for each class in a hierarchy, so always
// make sure you're being called for your *own* class, not some sub- or
// super-class which doesn't have its own implementation of this method
if ( self != [MyClass class] )
return;
PriorityTransformer * obj = [[PriorityTransformer alloc] init];
[NSValueTransformer setValueTransformer: obj forName: @"PriorityTransformer"];
[obj release]; // obj is retained by the transformer lookup table
}