Как создать прототип 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 ответ
Итак, очевидное (?) Решение сработало:
В Интерфейсном Разработчике перетащите простой ваниль
NSView
в таблицу (он будет принимать только падение в определенном столбце, а не как прямой дочерний элемент представления таблицы).Перейдите в инспектор идентификации для только что удаленного представления и измените его класс на "NSTableRowView".
Поскольку просто установить свойство.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()
}
}
... после того, как он был добавлен (и его цвет фона настроен представлением таблицы).
(Между прочим, получается, что мне все-таки не нужен настраиваемый вид строки. По крайней мере, не нужно настраивать цвет фона)