0

我有一个表格视图,其中最右边的列有一个 NSSegmentedCell。

从中提取单元格的 NSSegmentedControls 使用“任何”跟踪模式(又名:多选),并且根据可能值为 1、2 和 4 的位域选择段。值为 1 表示 A|b |c。2是a|B|c。4是a|b|C。3 是 A|B|c 等等...

该位域由数据源的 tableView:objectValueForTableColumn:row: 方法返回,单元格在委托的 tableView:dataCellForTableColumn:row: 方法中返回。

在 tableView:dataCellForTableColumn:row: 中单独设置单元格不会做任何事情,因为表视图调用 tableView:objectValueForTableColumn:row: 之后就可以获取该列的值,然后使用它来设置“值”分段控制/单元。

问题就在那个时候。

看起来位域被误解为段的索引值:0 表示 A,1 表示 B,2 表示 C(和 -1 表示无选择)......假设单选。

如何进行此设置,以便表格视图正确设置多个段?(例如:位域 3 = A|B|c)

4

1 回答 1

1

我是这样做的,它可以工作:
1)确保您在tableview的数据源/委托方法中引用了分段控制单元格;在我的项目中,我只是在我的视图控制器类中将分段控制单元与插座属性连接起来

2)从表的数据源 getter 方法中为具有分段控制的列返回任何内容(在我的项目中,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];
        }
    }
}

您需要在表格视图即将显示时配置分段单元格,根据您的模型详细信息进行配置,例如,在我的项目中我有一个可变字典days,它包含与段对应的布尔值,如{0:NO , 1: YES, 2: NO, 3:YES, 4:NO, 5:NO, 6:NO},其中 0, 1, 2, 3, 4, 5, 6 - 段,YES/NO - 是否segment selected or no

4) 最后,实现tableview的datasource setter方法;传递给它的对象是点击段索引;适当修改您的模型,即为单击的段索引翻转标志:

- (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]];
    }
}
于 2014-01-19T13:05:33.227 回答