Представленный на основе 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;