Привязки NSPopupButton с преобразователем значений

Я не знаю, является ли то, что я вижу со всплывающей кнопкой, заполненной привязками с преобразователем значений, тем, чем оно должно быть, или нет - необычная вещь, которую я вижу (по крайней мере, в отношении того, что я видел с преобразования значений и табличных представлений) заключается в том, что параметр «значение» в методе transformValue: представляет собой весь массив, привязанный к контроллеру массива, а не отдельные строки в массиве. Когда я сделал это с табличными представлениями, преобразователь вызывается один раз для каждой отображаемой строки в таблице, а параметр «значение» — это любой объект, привязанный к этой строке и столбцу, а не весь массив, который служит массивом содержимого. для контроллера массива.

У меня есть очень простое приложение, чтобы проверить это. В делегате приложения есть следующее:

+(void)initialize {
    RDTransformer *transformer = [[RDTransformer alloc] init];
    [NSValueTransformer setValueTransformer:transformer forName:@"testTransformer"];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.theData = @[@{@"name":@"William", @"age":@"24"},@{@"name":@"Thomas", @"age":@"23"},@{@"name":@"Alexander", @"age":@"64"},@{@"name":@"James", @"age":@"47"}];
}

В классе RDTransformer это:

+ (Class)transformedValueClass {
    return [NSString class];
}


+(BOOL)allowsReverseTransformation {
    return NO;
}

-(id)transformedValue:(id)value {
    NSLog(@"%@",value);
    return value;
}

В IB я добавил NSPopupButton в окно и контроллер массива в список объектов. Массив содержимого контроллера привязан к App Delegate.theData, а значения содержимого всплывающей кнопки привязаны к Array Controller.arrangedObjects.name с преобразователем значений testTransformer.

Когда я запускаю программу, журнал метода transformValue: выглядит следующим образом:

2012-09-19 20:31:39.975 PopupBindingWithTransformer[793:303] (
)
2012-09-19 20:31:40.019 PopupBindingWithTransformer[793:303] (
    William,
    Thomas,
    Alexander,
    James
)

Это не похоже на опыт других людей из того, что я вижу на SO. Есть ли что-то, что я делаю неправильно либо с привязками, либо с преобразователем значений?


person rdelmar    schedule 20.09.2012    source источник


Ответы (1)


К сожалению, именно так работает NSPopUpButton. Проблема не ограничивается этим контролем. Если вы попытаетесь привязать NSArrayController.contentArray к другому NSArrayControllers.arrangedObject.someProperty, вы получите ту же проблему. Вот простой обходной путь, который я использую во всех своих преобразователях значений, который заставляет их работать как с таблицами, так и с всплывающими окнами:

Вы можете изменить преобразователь значений следующим образом:

-(id)transformedArrayValue:(NSArray*)array
{
    NSMutableArray *result = [NSMutableArray array];
    for (id value in array)
        [result addObject:[self transformedValue:value]];

    return result;
}

-(id)transformedValue:(id)value
{
    if ([value isKindOfClass:[NSArray class]])
        return [self transformedArrayValue:value];

    // Do your normal-case transform...
    return [value lowercaseString];
}

Он не идеален, но его легко воспроизвести. На самом деле я поместил transformedArrayValue: в категорию класса, чтобы мне не нужно было копировать его везде.

person aLevelOfIndirection    schedule 24.09.2012
comment
Да, я сделал что-то подобное, чтобы мой трансформер работал с всплывающей кнопкой. Пока вы знаете, что он возвращает массив и рассматриваете его как таковой, вы можете заставить их работать. Я подожду и посмотрю, появится ли что-нибудь еще в течение следующих нескольких дней, но если нет, я приму ваш ответ. - person rdelmar; 25.09.2012
comment
Вау, спасибо за это! Где, черт возьми, ЭТО задокументировано? Действительно, очень плохая работа для самой дорогой компании на планете. - person Jay; 23.11.2012