gpt4 book ai didi

cocoa - NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny

转载 作者:行者123 更新时间:2023-12-03 17:54:46 25 4
gpt4 key购买 nike

我有一个 TableView ,其最右侧的列有一个 NSSegmentedCell。

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

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

在 tableView:dataCellForTableColumn:row: 中单独设置单元格不会执行任何操作,因为 TableView 在此之后调用 tableView:objectValueForTableColumn:row: 来获取该列的值,然后使用它来设置“值”分段控制/单元格的“。

问题就在此时。

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

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

最佳答案

我这样做了,它的工作原理:
1)确保您在 TableView 的数据源/委托(delegate)方法中引用了分段控制单元格;在我的项目中,我只是将分段控制单元与 View Controller 类中的outlet属性连接

2)从表的数据源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的委托(delegate)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];
}
}
}

当表格 View 即将显示分段单元格时,您需要配置分段单元格,根据您的模型详细信息进行配置,例如,在我的项目中,我有一个可变字典days,它包含与分段对应的 bool 值,例如{ 0: NO, 1: YES, 2: NO, 3:YES, 4:NO, 5:NO, 6:NO},其中 0, 1, 2, 3, 4, 5, 6 - 段,以及 YES/NO - 是否选择此分割

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

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

关于cocoa - NSTableView + NSSegmentedControl + NSSegmentSwitchTrackingSelectAny,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com