В случае, если кому-то еще будет тяжело с этим, я думаю, что это работает. Как ни странно, ответ cellcortex работает с использованием setTextColor
, но любые изменения, сделанные с использованием setAttributedStringValue
во встроенном textField, все еще перезаписываются. Если вы создаете подкласс NSTableCellView
и настраиваете выпуск для NSTextField
, вы можете изменить значение приписанной строки через этот выход и не перезаписывать изменения.
Вот как я это сделал с представлением на основе NSOutlineView
: Представление структуры имеет столбец с идентификатором «Подробности». Этот столбец имеет подкласс NSTableCellView
(DBTableCellView
) с идентификатором «DetailCellView». Это DBTableCellView
имеет NSTextField
внутри. DBTableCellView
имеет выход к 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;
}
}