Как создать прототип NSTableRowView в Интерфейсном Разработчике

У меня есть вид на основе NSTableView и я пытаюсь настроить внешний вид определенных строк.

Я понимаю, что мне нужно реализовать метод делегата, упомянутый в заголовке; Однако я не уверен, как это сделать.

В документации сказано:

Вы можете использовать метод делегата tableView:rowViewForRow: для настройки представлений строк. Обычно вы используете Interface Builder для проектирования и размещения строк прототипа NSTableRowView в таблице. Как и в случае с прототипными ячейками, строки прототипа извлекаются программно во время выполнения. Реализация подклассов NSTableRowView не является обязательной.

Однако, в отличие от клеток, нет NSTableRowView класс в построителе интерфейса, и не ясно, как настроить представление строки "прототип".

Я пытаюсь что-то вроде этого (Swift 3):

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView?
{
    if (row % 4) == 0 {
        // .................................................. 
        // [ A ] SPECIAL ROW:

        if let rowView = tableView.make(withIdentifier: "SpecialRow", owner: self) as? NSTableRowView {

            rowView.backgroundColor = NSColor.gray()
            return rowView
        }
        else {
            return nil
        }

        // ^ Always returns nil (Because I don't know how
        // to setup the prototype in Interface Builder)
    }
    else{
        // ..................................................
        // [ B ] NORMAL ROW (No customization needed)

        return nil
    } 
}

У меня есть аналогичный код, работающий для ячеек -ie, -tableView:viewForTableColumn:row:,

1 ответ

Решение

Итак, очевидное (?) Решение сработало:

  1. В Интерфейсном Разработчике перетащите простой ваниль NSView в таблицу (он будет принимать только падение в определенном столбце, а не как прямой дочерний элемент представления таблицы).

  2. Перейдите в инспектор идентификации для только что удаленного представления и измените его класс на "NSTableRowView".

  3. Поскольку просто установить свойство.backgroundColor, как в моем коде, не работает, я вместо этого использовал это решение и добавил представление в виде дочернего элемента и настроил его в Интерфейсном Разработчике. Я должен был установить ограничения автоматического размещения между полем и представлением строки, чтобы он растягивался до фактического размера представления строки во время выполнения.

(В качестве альтернативы, я мог бы поиграть с wantsLayer свойство представления строки...)


ОБНОВЛЕНИЕ: Оказывается, backgroundColor свойство, которое я использовал в моем коде, определено в NSTableRowView (NSView не имеет такого свойства, в отличие от UIView).

Но он также переопределяется настройкой табличного представления (т. Е. Чередующимися строками или нет), поэтому вместо этого я должен настроить его следующим способом:

func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int)
{
    if (row % 4) == 0 {
        rowView.backgroundColor = NSColor.controlAlternatingRowBackgroundColors()[1]
    }
    else{
        rowView.backgroundColor = NSColor.clear()
    }    
}

... после того, как он был добавлен (и его цвет фона настроен представлением таблицы).

(Между прочим, получается, что мне все-таки не нужен настраиваемый вид строки. По крайней мере, не нужно настраивать цвет фона)

Другие вопросы по тегам