2016-08-15 113 views
2

我有一個基於視圖的NSTableView,我試圖自定義某些行的外觀。如何在界面生成器中製作NSTableRowView原型

我明白我需要實現標題中提到的委託方法;但是我不確定如何去做。

文檔說:

您可以使用委託方法的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 
    } 
} 

我有類似的代碼細胞 -i.e.,-tableView:viewForTableColumn:row:工作。

回答

1

OK,所以顯而易見的解決方案的工作(?):

  1. 在Interface Builder中,拖放一個普通的香草NSView到表(它將只接受特定列的下降,而不是作爲表視圖的直接子)。

  2. 轉到Identity Inspector查看剛刪除的視圖,並將其類更改爲「NSTableRowView」。

  3. 因爲只是在我的代碼中設置.backgroundColor屬性不起作用,所以我改爲使用this solution,並將子視圖添加爲子視圖,並在Interface Builder中對其進行配置。我必須在盒子和行視圖之間設置自動佈局約束,以便在運行時延伸到行視圖的實際大小。

(或者,我可以發揮與行視圖的wantsLayer屬性...)


UPDATE:原來,backgroundColor財產,我用我的代碼是在NSTableRowViewNSView不具有此屬性,與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() 
    }  
} 

... 後加入(以及由表視圖配置的背景顏色)。

(順便說一句,事實證明我不需要自定義行視圖,至少不需要自定義背景顏色)