过去,使用基于单元格的NSTableView
,您可以在tableView:willDisplayCell:forTableColumn:row
方法中修改单元格的属性(例如,为其中一个单元格设置自定义NSAttributedString
显示)。是否存在基于视图的表视图的等效方法?
在基于视图的表视图中不会调用实现tableView:willDisplayCell:forTableColumn:row
,因此我不确定该怎么做。
我想使用默认NSAttributedString
实例的setAttributedStringValue
方法设置NSTextField
,该实例包含在从Xcode中创建的NSTableCellView
实例中。
到目前为止,我的努力总是被表视图本身所取消。有什么想法吗?
答案 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”的子类NSTableCellView
(DBTableCellView
)。此DBTableCellView
内部有NSTextField
。 DBTableCellView
有一个名为“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;