基于视图的NSTableView相当于tableView:willDisplayCell:forTableColumn:row?

时间:2011-07-26 21:11:35

标签: objective-c cocoa nstableview

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

在基于视图的表视图中不会调用实现tableView:willDisplayCell:forTableColumn:row,因此我不确定该怎么做。

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

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

4 个答案:

答案 0 :(得分:9)

我用它来改变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实际上对我有所改变,我相信你也应该能够在那里设置其他属性。

答案 1 :(得分:3)

显然,NSTableViewDelegate有一些新方法:

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

我认为对于基于视图的NSTableView,这两个都将被调用。我想你需要第一个。

答案 2 :(得分:0)

如果其他人对此感到困难,我想我已经开始工作了。 Oddly cellcortex的答案使用setTextColor,但在内置textField上使用setAttributedStringValue进行的任何更改仍会被覆盖。如果您继承NSTableCellView并为NSTextField创建自定义插座,则可以通过此插座修改属性字符串值,而不会覆盖您的更改。

以下是我使用基于视图的NSOutlineView的方法:大纲视图中有一个标识符为“Detail”的列。此列具有带有标识符“DetailCellView”的子类NSTableCellViewDBTableCellView)。此DBTableCellView内部有NSTextFieldDBTableCellView有一个名为“customTextField”的NSTextField出口。

大纲视图委托具有以下方法:

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

  }

}

答案 3 :(得分:-7)

检查NSTableViewDelegate Protocol Reference,您将获得所需的方法:

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