2016-08-15 10 views
2

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

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

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

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

Однако, в отличие от клеток, нет NSTableRowView класса в Interface Builder, и не ясно, как настроить «прототип» вид строки.

Я пытаюсь что-то вроде этого (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 
    } 
} 

У меня есть подобный код работает для клеток -i.e., -tableView:viewForTableColumn:row:.

ответ

1

OK, поэтому очевидное решение работало (?):

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

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

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

(С другой стороны, я мог бы сыграть с wantsLayer свойства зрения ряда ...)


UPDATE: Оказывается 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() 
    }  
} 

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

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