NSTableView на основе представления, эквивалентный tableView: willDisplayCell: forTableColumn: row? - PullRequest
12 голосов
/ 27 июля 2011

Раньше с помощью NSTableView на основе ячеек можно было изменять атрибуты ячейки в методе tableView:willDisplayCell:forTableColumn:row (например, настраивая пользовательский NSAttributedString для одной из отображаемых ячеек).Есть ли эквивалентный метод для табличного представления на основе представления?

Реализация tableView:willDisplayCell:forTableColumn:row не вызывается в табличном представлении на основе представления, поэтому я не уверен, что делать.

Я хочу установить NSAttributedString, используя метод setAttributedStringValue экземпляра NSTextField по умолчанию, который включен в экземпляр NSTableCellView, созданный из Xcode.

Мои усилия до сих пор всегда сводятсясамо представление таблицы.Есть идеи?

Ответы [ 4 ]

9 голосов
/ 20 марта 2012

Я использовал это, чтобы изменить цвет текста в 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;
}

Поскольку цвет текста на самом деле для меня меняется, я считаю, что вы также сможете установить и другие атрибуты.

3 голосов
/ 27 июля 2011

Очевидно, в NSTableViewDelegate есть несколько новых методов:

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

Я предполагаю, что для NSTableView на основе представления будут вызваны оба этих метода.Я думаю, вам нужен первый из них.

0 голосов
/ 16 августа 2013

В случае, если кому-то еще будет тяжело с этим, я думаю, что это работает. Как ни странно, ответ 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;

  }

}
0 голосов
/ 27 июля 2011

Проверьте Справочник по протоколу NSTableViewDelegate , вы найдете нужный вам метод:

- (void)tableView:(NSTableView *)aTableView
  willDisplayCell:(id)aCell
   forTableColumn:(NSTableColumn *)aTableColumn
              row:(NSInteger)rowIndex;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...