Как заставить NSTableView использовать настраиваемое представление ячеек, смешанное с предустановленными представлениями ячеек?

У меня есть NSTableView, настроенный в Interface Builder, который использует несколько представлений ячеек по умолчанию. Однако представление ячейки первого столбца необходимо создать из пользовательского класса. Как реализовать метод NSTableViewDataSource tableView.viewForTableColumn(), чтобы он создавал представления ячеек по умолчанию для остальных столбцов?

Вот мой метод до сих пор:

func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row:Int) -> NSView?
{
    /* Create custom cell view for first column. */
    if (tableColumn?.identifier == "nameColumn")
    {
        let view = tableView.makeViewWithIdentifier("nameCellView", owner: nil) as! NameTableCellView;
        return view;
    }

    /* Return default cell views (defined in IB) for the rest. */
    return tableView.viewAtColumn(??, row: row, makeIfNecessary: true); // How to get column index??
}

Как получить правильный индекс столбца для tableView.viewAtColumn()? tableView.columnForView() или tableView.columnWithIdentifier() в данном случае явно не вариант.


person BadmintonCat    schedule 15.06.2015    source источник


Ответы (2)


Я бы попробовал просто дать ячейке по умолчанию свой собственный идентификатор в Interface Builder...

введите здесь описание изображения

... затем просто используйте это вместе с makeViewWithIdentifier::

func tableView(tableView: NSTableView,
    viewForTableColumn
    tableColumn: NSTableColumn?, row: Int) -> NSView? {

        var viewIdentifier = "StandardTableCellView"

        if let column = tableColumn {

            switch column.identifier {

            case "nameColumn":
                viewIdentifier = "nameCellView"

            default: break

            }
        }

        return tableView.makeViewWithIdentifier(viewIdentifier, owner: self) as? NSView
}
person Paul Patterson    schedule 15.06.2015
comment
Да я думаю, что другого выхода нет. Самым быстрым было бы дать столбцам и ячейкам одинаковые идентификаторы, например. 0, 1, 2, 3... и т. д., а затем создайте ячейки с указанным идентификатором столбца. - person BadmintonCat; 15.06.2015

Я нашел хорошее решение проблемы: вы можете сделать так, чтобы идентификаторы столбцов таблицы совпадали с идентификаторами соответствующих ячеек представления. После этого вы можете использовать в своем делегате:

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

    NSTableCellView *cell = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:NULL];


    return cell;
}

С этой отправной точки вы можете легко выполнить действие для определенного идентификатора столбца и вместо этого создать другое представление ячейки в соответствии с вашей логикой.

person Alfonso Tesauro    schedule 02.12.2016