2013-03-07 1 views
0

У меня есть табличный вид, который имеет NSSegmentedCell для его самого правого столбца.NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny

NSSegmentedControls, из которого вытаскиваются ячейки, использует «любой» режим отслеживания (ака: множественный выбор), и сегменты выбираются на основе битового поля с возможными значениями: 1, 2 и 4. Значение 1 означает A | b | c. 2 является | B | c. 4 является | b | C. 3 является A | B | c и т. Д.

Это битовое поле возвращается таблицей источников данныхViewView: objectValueForTableColumn: строка: метод и ячейка возвращается в таблице делегата: dataCellForTableColumn: row: method.

Установка ячеек отдельно в таблицеView: dataCellForTableColumn: строка: ничего не делает, поскольку табличное представление вызывает tableView: objectValueForTableColumn: строка: сразу после этого, чтобы получить значение для этого столбца, а затем использует его для установки " значение "сегментированного элемента управления/ячейки.

Проблема в этом пункте.

Похоже, что битовое поле неверно интерпретируется как индексное значение сегмента: 0 для A, 1 для B и 2 для C (и -1 для выбора) .... которое предполагает единственный выбор.

Как настроить эту настройку так, чтобы в представлении таблицы было правильно установлено несколько сегментов? (например: битовое поле 3 = A | B | c)

ответ

0

Я сделал это таким образом, и он работает:
1) убедитесь, что у вас есть ссылка на сегментированную ячейку управления в методах datasource/delegate в tableview; в моем проекте я только что связал сегментированную ячейку управления с свойством outlet в моем классе контроллера класса

2) вернуть что-либо из метода getatource-метода таблицы для столбца с сегментированным контролем (в моем проекте repeatDays является идентификатором этого столбца), для Например, ноль

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex { 
    NSString *colId = [tableColumn identifier]; 

    if ([colId isEqualToString:@"repeatDays"]) { 
     return nil; 
    } 

    //handle other columns 
} 

3) осуществлять Tableview в делегатом willDisplayCell метод

- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    NSString *colId = [tableColumn identifier]; 

    if ([colId isEqualToString:@"repeatDays"]) { 
     for (int i = 0; i < self.segmentedCell.segmentCount; ++i) { 
      BOOL selected = [[self.days objectForKey:[NSNumber numberWithInt:i]] boolValue]; 
      [self.segmentedCell setSelected:selected forSegment:i]; 
     } 
    } 
} 

вам нужно настроить сегментированную ячейку, когда представление таблицы собирается показать его, сделайте это в соответствии с вашими моделями деталей, например, в моем проекте у меня есть изменяемые словарные дни, и он содержит значения bool, соответствующие сегментам, такие как {0: NO, 1: YES, 2: NO, 3: YES, 4: NO, 5: NO, 6: NO}, где 0, 1, 2, 3, 4, 5, 6 - сегменты и ДА/НЕТ - выбран ли этот сегмент или нет

4) последний, реализовать метод установки источника данных tableview; объекту, переданному ему, кликается индекс сегмента; соответствующим образом измените вашу модель, то есть флаг флип для индекса сегмента кликов:

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    NSString *colId = [tableColumn identifier]; 

    if ([colId isEqualToString:@"repeatDays"]) { 
     int i = [object intValue]; 
     BOOL selected = [[self.days objectForKey:[NSNumber numberWithInt:i]] boolValue]; 
     [self.days setObject:[NSNumber numberWithBool:!selected] forKey:[NSNumber numberWithInt:i]]; 
    } 
}