1

Является NSValueTransform подклассы хороший выбор для отображения атрибутов основных данных в представления пользовательского интерфейса отображения:какао Наручники - NSTableView - подкачка Значения

  1. Число строк, как (0,1,2,3 и т.д.) в строка, такие как (в ожидании, завершенного, замороженные, в стадии разработки, и т.д.)
  2. ряд строки, как (0,1) в приложение на основе изображения (red.png если 0, green.png если 1)

Вот что отображает основные данные для двух атрибутов, таймера и состояния:

enter image description here

Вот что я хочу, чтобы отображаться вместо этого, не изменяя значения в Core Data:

enter image description here

Если не использовать NSValueTransformer, в какой другой способ это возможно?

Я не хочу, чтобы данные постоянно конвертировались, только в целях уменьшения объема данных, хранящихся в базовых данных и улучшенных элементов представления пользовательского интерфейса.

Я также попытался изменить атрибуты в классе управляемых объектов (без уведомления KVO) без везения.

+1

Я так не думаю, что для 1 или 2. Преобразователи ценности отлично подходят для наложения объектов в основные данные, и они хороши для преобразования строк в строки и числа и все такое. Но № 1, который вы связываете с атрибутом состояния в своей сущности, и нет причин, чтобы модель не была явной, и иметь представление, преобразующее ее в нечто читаемое, а не в основном похороны в аксессуарах, что и есть здесь происходит преобразование значений. Когда я их использую, я никогда не нахожу их сразу, зарытыми где-то вдали от того места, где они имеют значение. – stevesliva

+1

Кроме того, с точки зрения эффективного хранения для перечисленных типов есть [этот ответ о перечислениях в Core Data] (http://stackoverflow.com/a/13224056/3120884) – stevesliva

+0

На самом деле, это неплохо ... Я просто добавил NSValueTransform к NSTableView, где я ранее просто отображал значение enum int ... и он отлично работал! – geowar

ответ

1

Я закончил с использованием того, что на первый, казалось, блокируя отображение различной информации в этих клетках, используя:

#pragma mark - Table View Delegate 

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    /* tableColumn = (string) @"AutomaticTableColumnIdentifier.0" 
       row = (int) 0   */ 
    NSString *identifier = [tableColumn identifier]; 
    NSTableCellView *cellView = [tableView makeViewWithIdentifier:identifier owner:self]; 

    NSManagedObject *item = [self.itemArrayController.arrangedObjects objectAtIndex:row]; 

    if ([identifier isEqualToString:@"AutomaticTableColumnIdentifier.0"]) { 
     /* subviews returns array with 0 = Image View & 
             1 = Text Field  */ 
     /* First, set the correct timer image */ 
     ... logic ... 
     NSImageView *theImage = (NSImageView *)[[cellView subviews] objectAtIndex:0]; 
     theImage.image = [NSImage imageNamed:@"green.gif"]; 

     /* Second, display the desired status */ 
     NSTextField *theTextField = (NSTextField *)[[result subviews] objectAtIndex:1]; 
     ... logic ... 
     theTextField.stringValue = @"Pending"; 
    } 

    return cellView; 
} 

документации состояния компании Apple (где-то), что связывание с массивом контроллера может работать в сочетании с ручное заполнение ячеек таблицы. Лучше всего и проще всего начать с привязок, а затем уточнить отображаемые значения вручную.

1

Да, NSValueTransformer Подклассы работают просто отлично для этой цели.

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

Например:

+ (NSSet*) keyPathsForValuesAffectingStatusDisplayName 
{ 
    return [NSSet setWithObject:@"status"]; 
} 
- (NSString*) statusDisplayName 
{ 
    NSString* status = self.status; 
    if ([status isEqualToString:@"0"]) 
     return @"Pending"; 
    else if ([status isEqualToString:@"1"]) 
     return @"Completed"; 
    // ... 
} 

Метод +keyPathsForValuesAffectingStatusDisplayName позволяет КВО и привязок знать, что, когда status изменения, так что делает этот новый statusDisplayName свойство. См. Документы для +keyPathsForValuesAffectingValueForKey:, чтобы узнать, как это работает.

+0

И тогда мы добавляем этот класс ValueTranformer к привязке для этих ячеек? Спасибо за предложение кода. Я буду работать над новым классом и читать только для чтения и отвечать завтра. – David

+0

Знаете ли вы, что еще один способ оставить значения атрибутов неизменными при отображении чего-то еще? – David

+1

Да, вы должны добавить трансформатор значения к привязке для этих ячеек. Возможно, существует множество подходов к отображению чего-то другого, например, использование пользовательского класса представления для ячейки или настройка ячейки в '-tableView: viewForTableColumn: row:' или что-то еще. –