Изменить ячейку в выбранной строке - PullRequest
0 голосов
/ 18 мая 2009

Очевидно, я слишком долго работал с привязками, потому что не могу понять, как это сделать. У меня есть таблица с несколькими столбцами. Когда строка выбрана, вы можете редактировать ее приоритет, который изменяет основной атрибут данных. Я также установил это как IBAction. По сути, я хочу получить доступ к значению атрибута Core Data из моего кода. Затем я хочу установить в первом столбце выбранной строки (с измененным приоритетом) количество восклицательных знаков, соответствующих уровню приоритета.

Извините, это смущает; Вот пример:

Строка 7 выбрана. Я изменяю его приоритет на 2. Теперь атрибут Core Data myPriority установлен на 2. Теперь запускается блок кода. Он получает приоритет выбранной строки (строки 7) формы Core Data и хочет установить для столбца 1 выбранной строки (строки 7) 2 восклицательных знака (приоритет 2).

Спасибо!

1 Ответ

1 голос
/ 18 мая 2009

Если вы привыкли к привязкам, то я бы порекомендовал взглянуть на 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...