【问题标题】:NSButton inside NSTableView Programmatically?NSTableView中的NSButton以编程方式?
【发布时间】:2011-04-01 04:52:38
【问题描述】:

如何在 NSTableView 中设置一列复选框?到目前为止,这就是我所做的,但它只是将 int 1 放在列中,而不是复选框:

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
    if ([[tableColumn identifier] isEqualToString:@"Enable"]) {
        NSButtonCell *cell=[[[NSButtonCell alloc] init] autorelease];
        [cell setAllowsMixedState:YES];
        [cell setButtonType:NSSwitchButton];
        NSCell *aCell = [tableColumn dataCellForRow:row];
        [aCell setObjectValue:cell];
        return [NSNumber numberWithInt:1];
    }

    return [[data objectAtIndex:row+1] objectAtIndex:[[data objectAtIndex:0] indexOfObject:[tableColumn identifier]]];
}

【问题讨论】:

  • 您应该实现NSTableViewDelegate 方法tableView:willDisplayCell:forTableColumn:row:tableView:dataCellForTableColumn:row:,而不是在objectValueForTableColumn:... 中获取单元格(我不清楚您要做什么)。

标签: objective-c cocoa nstableview nsbutton


【解决方案1】:

您需要使用 dataCellForTableColumn 委托方法。

- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

   if([[tableColumn identifier] isEqualTo:@"delete"]){

    NSButtonCell *cell = [[[NSButtonCell alloc] init] autorelease];
    [cell setAllowsMixedState:YES];
    [(NSButtonCell *)cell setButtonType:NSSwitchButton];
    [cell setTitle:@""];

    return cell;

   }else {
    NSCell *cell = [tableColumn dataCell];
    return cell;  
   }  
}

【讨论】:

  • 它工作得很好,但是当我拖放单元格的行时,按钮保持在“旧”位置,它们不会重绘。如何解决这个问题?
【解决方案2】:

在 Interface Builder 中,将复选框单元格拖到表格列中。这将为该列设置数据单元格。在其检查器中设置您想要的单元格。然后删除您在此处对单元格起作用的所有代码,并返回 NSNumber

响应您以编程方式执行此操作的愿望:Interface Builder 确实是您的理想之选。它是为布置 GUI 对象而设计的。不过我会告诉你怎么做。

首先,在 NSCell 上调用 setObjectValue: 和另一个 NSCell 作为参数不会将第一个转换为第二个,或者更改指针值或类似的东西。 setObjectValue: 方法改变了objectValue of the cell——本质上,它显示为文本的对象。

如果您想以编程方式为表格列提供一个单元格,您需要在某处使用您想要的NSCell 调用-[NSTableColumn setDataCell:]awakeFromNib 可能是一个不错的选择),但请注意,表格column 为每一行重复使用相同的单元格实例,并在绘制之前对其进行修改,以便正确显示。无法为列中的每一行设置不同的单元格,更新:无需子类化 NSTableColumn

【讨论】:

  • 感谢您的回答,但我想以编程方式执行此操作。
  • 我正在尝试将复选框添加到表格的一列,但是一旦将其拖入,我就无法再在 tableView:objectValueForTableColumn:row: 方法中返回其他列的字符串.我找不到任何关于此的文档,该方法只需要返回一个对象(id),但我不知道我应该返回什么。我可以在同一个表中没有字符串和复选框吗?
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多