2013-03-07 24 views
0

我有一個表格視圖,其最右邊的列有一個NSSegmentedCell。NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny

單元格從中拉出的NSSegmentedControls使用「任意」跟蹤模式(又名:多選),並根據可能值爲1,2和4的位域選擇片段。值爲1意味着A | b | c。 2是| B | c。 4是| b | C。 3是A | B | c等...

該位域由數據源的tableView:objectValueForTableColumn:row:method返回,並在委託的tableView:dataCellForTableColumn:row:method中返回單元格。

單獨在tableView中設置單元格:dataCellForTableColumn:row:不做任何事情,因爲表視圖調用tableView:objectValueForTableColumn:row:之後獲取該列的值,然後使用它來設置「值「的分段控制/單元格。

問題出在這一點。

它看起來像位域被誤解爲段的索引值:0代表A,1代表B,2代表C(而-1代表無選擇)......假定單一選擇。

如何獲得此設置,以便表視圖可以正確設置多個分段? (例如:位域3 = A | B | c)

回答

0

我這樣做,它的工作原理:
1)確保你的tableview的數據源/委託方法中有分段控制單元的引用;在我的項目中,我剛剛在視圖控制器類中連接了帶有outlet屬性的分段控制單元

2)爲帶分段控件的列(在我的項目中,repeatDays是此列的標識符)返回表的數據源getter方法中的任何內容例如,零

- (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]; 
     } 
    } 
} 

需要配置分段單元時表視圖即將顯示,這樣做根據你的模型的細節,例如,在我的項目中,我有一個可變的詞典天,並且它包含對應於段的布爾值,如{0:否,1:是,2:否,3:是,4:否,5:否,6:否},其中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]]; 
    } 
}