Cocoa NSTableView&x2B;NSSegmentedControl+;NSSECTIONSWITCHTRACKINGSELECTANY

Cocoa NSTableView&x2B;NSSegmentedControl+;NSSECTIONSWITCHTRACKINGSELECTANY,cocoa,nstableview,nssegmentedcontrol,Cocoa,Nstableview,Nssegmentedcontrol,我有一个表视图,最右边的列有一个NSSegmentedCell NSSegmentedControls使用“任意”跟踪模式(又名:多选)从中提取单元格,并基于可能值为1、2和4的位字段选择片段。值为1表示A | b | c。2是a | B | c。4是a | b | C。3是a | b | C,等等 该位字段由数据源的tableView:objectValueForTableColumn:row:method返回,单元格在委托的tableView:dataCellForTableColumn:r

我有一个表视图,最右边的列有一个NSSegmentedCell

NSSegmentedControls使用“任意”跟踪模式(又名:多选)从中提取单元格,并基于可能值为1、2和4的位字段选择片段。值为1表示A | b | c。2是a | B | c。4是a | 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)

我是这样做的,它是有效的:
1)确保在tableview的数据源/委托方法中有对分段控制单元的引用;在我的项目中,我刚刚连接了视图控制器类中带有outlet属性的分段控制单元

2)从表的datasource getter方法中为具有分段控制的列返回任何内容(在我的项目中,repeatDays是此列的标识符),例如,nil

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