Представленный на основе NSTableView эквивалент tableView: willDisplayCell: forTableColumn: row?
В прошлом, с помощью NSTableView
на основе ячеек, вы могли изменять атрибуты ячейки в методе tableView:willDisplayCell:forTableColumn:row
(например, установив пользовательский NSAttributedString
для одной из отображаемых ячеек). Есть ли эквивалентный метод для представления таблиц на основе представления?
Реализация tableView:willDisplayCell:forTableColumn:row
не вызывается в представлении таблицы на основе представления, поэтому я не уверен, что делать.
Я хочу установить NSAttributedString
с помощью метода setAttributedStringValue
экземпляра NSTextField
по умолчанию, который включен в экземпляр NSTableCellView
, созданный из Xcode.
Мои усилия до сих пор всегда отменяются самим табличным представлением. Любые идеи?
Ответы
Ответ 1
Я использовал это, чтобы изменить цвет текста в viewForTableColumn
. Я читаю 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;
}
Поскольку для меня действительно меняется текст, я считаю, что вы также можете установить другие атрибуты.
Ответ 2
По-видимому, NSTableViewDelegate имеет несколько новых методов:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
Я предполагаю, что для NSTableView
на основе представления оба они будут вызваны. Я думаю, вам нужен первый из них.
Ответ 3
В случае, если кому-то еще не хватает времени, я думаю, что у меня это работает. Как ни странно, ответ с помощью cellcortex работает с использованием setTextColor
, но все изменения, сделанные с помощью setAttributedStringValue
на встроенном текстовом поле, все еще перезаписываются. Если вы подклассом 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;
}
}
Ответ 4
Отметьте NSTableViewDelegate Protocol Reference, вы будете там, где нужно:
- (void)tableView:(NSTableView *)aTableView
willDisplayCell:(id)aCell
forTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex;