【问题标题】:View-based NSTableView equivalent of tableView:willDisplayCell:forTableColumn:row?基于视图的 NSTableView 等效于 tableView:willDisplayCell:forTableColumn:row?
【发布时间】:2011-07-26 21:11:35
【问题描述】:

过去,使用基于单元格的NSTableView,您可以在tableView:willDisplayCell:forTableColumn:row 方法中修改单元格的属性(例如,为要显示的单元格之一设置自定义NSAttributedString)。基于视图的表格视图是否有等效的方法?

实现tableView:willDisplayCell:forTableColumn:row 不会在基于视图的表格视图中被调用,所以我不知道该怎么做。

我想使用默认NSTextField 实例的setAttributedStringValue 方法设置NSAttributedString,该实例包含在从Xcode 中创建的NSTableCellView 实例中。

到目前为止,我的努力总是被表格视图本身所抵消。有什么想法吗?

【问题讨论】:

  • 您是否将具有该方法的类设置为委托?
  • 是的,我正确设置了委托。当您使用基于视图的表格视图时,不会调用该方法。

标签: objective-c cocoa nstableview


【解决方案1】:

我用它来改变viewForTableColumn 中文本的颜色。我正在从 Interface builder 中读取 tableCellView。

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView *result = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
    result.textField.textColor = [NSColor redColor];
    return result;
}

由于 textcolor 对我来说实际上发生了变化,我相信您应该也可以在那里设置其他属性。

【讨论】:

  • 这个可以在行显示之前调用(NSTableView 实现缓存行稍后显示)。所以这个选择器与显示并不完全相关。
【解决方案2】:

显然,NSTableViewDelegate 有几个新方法:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row

我假设对于基于视图的NSTableView,这两个都将被调用。我猜你需要第一个。

【讨论】:

  • 在创建NSTableCellView 之后,我尝试在tableView:viewForTableColumn:row: 内部设置NSTextField 的属性。但是,在我返回 NSTableCellView 实例后,我的工作被表格视图撤消了。
  • @willbur1984 我知道这是一个老问题,但如果其他人在看这里,我猜你设置的属性是由 setBackgroundStyle 重置的。请注意文本颜色如何取决于单元格是否被选中。
【解决方案3】:

如果其他人对此有困难,我想我已经成功了。奇怪的是 cellcortex 的答案使用 setTextColor 有效,但在内置 textField 上使用 setAttributedStringValue 所做的任何更改仍会被覆盖。如果您将NSTableCellView 子类化并自定义出口到NSTextField,则可以通过此出口修改属性字符串值,而不会覆盖您的更改。

以下是我使用基于视图的NSOutlineView 的方法:大纲视图有一个标识符为“详细信息”的列。此列有一个子类NSTableCellView (DBTableCellView),标识符为“DetailCellView”。这个DBTableCellView 里面有一个NSTextFieldDBTableCellView 有一个到 NSTextField 的出口,它包含称为“customTextField”。

大纲视图委托有这个方法:

- (NSView*)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item{

  NSString *identifier = [tableColumn identifier];

  if ([identifier isEqualToString:@"Detail"]) {

    DBTableCellView * cellView = [outlineView makeViewWithIdentifier:@"DetailCellView" owner:self];

    NSTextField * textField = cellView.customTextField;

    NSString * originalString = [textField stringValue];

    if (originalString.length > 0){

      [textField setAllowsEditingTextAttributes: YES];
      [textField setSelectable: YES];

      NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:originalString];

      NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSColor blueColor], NSForegroundColorAttributeName,
                              [NSNumber numberWithInt:NSSingleUnderlineStyle],NSUnderlineStyleAttributeName, nil];

      NSRange range = NSMakeRange(0, [attrString length]);

      [attrString addAttributes:attributes range:range];

      [textField setAttributedStringValue: attrString];

    }

    return cellView;

  } else {  //specify other column identifiers here later

    return NULL;

  }

}

【讨论】:

    【解决方案4】:

    检查NSTableViewDelegate Protocol Reference,您将在那里找到您需要的方法:

    - (void)tableView:(NSTableView *)aTableView
      willDisplayCell:(id)aCell
       forTableColumn:(NSTableColumn *)aTableColumn
                  row:(NSInteger)rowIndex;
    

    【讨论】:

    • 我可能没有很好地表达我的问题,但我知道这是您用于基于单元格的表格视图的方法。我想知道基于视图的表视图是否有某种类似的钩子。在这种情况下不会调用上述方法。
    • 什么是基于视图的表格视图?
    • Lion 的新功能之一。请参阅documentation
    • 没错。我一直在学习 ;) @Rudy Velthuis 的回答不是你需要的吗?我阅读了下面的评论,这些方法之一是否曾经被调用过?
    • 它们都被调用了,但是在调用它们之后的某个时刻,表格视图撤消了我应用于文本字段的格式。这就是让我如此困惑的原因:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多