首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny

NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny
EN

Stack Overflow用户
提问于 2013-03-07 22:19:43
回答 1查看 395关注 0票数 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: method返回,单元格在委托的tableView:dataCellForTableColumn:row: method中返回。

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

问题就在这一点上。

它看起来像是位字段被误解为段的索引值:0代表A,1代表B,2代表C( -1代表没有选择)...假设是单项选择。

如何设置此设置,以便表视图可以正确设置多个段?(例如: bitfield 3= A|B|c)

EN

回答 1

Stack Overflow用户

发布于 2014-01-19 21:05:33

我是这样做的,它起作用了:

1)确保在tableview的数据源/委托方法中有对分段控制单元格的引用;在我的项目中,我刚刚将分段控制单元格与视图控制器类中的outlet属性连接起来

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

代码语言:javascript
复制
 - (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方法

代码语言:javascript
复制
- (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-分段,YES/NO -该分段是否被选中

4)最后,实现tableview的数据源setter方法,传入的对象为点击分段索引,适当修改您的模型,即点击分段索引翻转标志:

代码语言:javascript
复制
- (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]];
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15273559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档