2015-11-30 60 views
12

我已經成功地在代碼中創建了一個基於單元格的NSTableView。我想讓這些單元格更有趣一點,我已經讀過,我需要創建一個基於視圖的NSTableView。是否有可能純粹在代碼中創建基於視圖的NSTableView?

我一直在教程如this

我的用戶界面的其餘部分完全在代碼中。我一直在努力爲這個tableview做同樣的事情,但沒有多少運氣。

這裏是我正在定義的TableView - 我需要停止註冊筆尖,我不知道如何:

 let nib = NSNib(nibNamed: "TransactionCellView", bundle: NSBundle.mainBundle()) 
     tableOfTransactions.registerNib(nib!, forIdentifier: "TransactionCellView") 

     tableOfTransactions.headerView = nil 

     tableOfTransactions.setDelegate(self) 
     tableOfTransactions.setDataSource(self) 
     tableOfTransactions.reloadData() 

這裏是我的存根代碼每個單元格:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{ 
     var testCell = NSView() 
     testCell.frame = NSRect(x: 0, y: 0, width: 300, height: 200) 
     return testCell 
} 

任何指示或建議如何實現這一點將不勝感激!

+0

如果你不註冊註冊表會發生什麼? – Willeke

回答

5

你實現-tableView(_:viewForTableColumn:row:)應該是這個樣子:

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

     var retval: NSView? 
     if let spareView = tableView.makeViewWithIdentifier("CodeCreatedTableCellView", 
      owner: self) as? NSTableCellView { 

      // We can use an old cell - no need to do anything. 
      retval = spareView 

     } else { 

      // Create a text field for the cell 
      let textField = NSTextField() 
      textField.backgroundColor = NSColor.clearColor() 
      textField.translatesAutoresizingMaskIntoConstraints = false 
      textField.bordered = false 
      textField.controlSize = NSControlSize.SmallControlSize 

      // Create a cell 
      let newCell = NSTableCellView() 
      newCell.identifier = "CodeCreatedTableCellView" 
      newCell.addSubview(textField) 
      newCell.textField = textField 

      // Constrain the text field within the cell 
      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      textField.bind(NSValueBinding, 
       toObject: newCell, 
       withKeyPath: "objectValue", 
       options: nil) 

      retval = newCell 
     } 

     return retval 
} 

在你的表中包含數百行的情況下,可可將嘗試重新使用已創建的視圖,但不再在屏幕上。這段代碼的第一部分使用NSTableView方法來查找這樣的視圖。如果找不到,則需要從頭創建一個。

如果您沒有理由不這樣做,則應該使用NSTableCellView的實例(或子類)作爲您的視圖。它對NSView沒有太大影響,但它的一個關鍵特徵是它保留了對視圖所代表的模型的引用(由-tableView(_:objectValueForTableColumnRow:row:)設置)。在這個例子中,我使用這個特性來設置使用綁定的文本字段的字符串值。

要注意的另一件事是,你應該給你的視圖一個標識符,該標識符與你給視圖所在的NSTableColumn的標識符相匹配。這樣做可以讓您的表視圖利用上面討論的可重用視圖功能。

+0

這確實有助於讓單元顯示在可視化調試器中。有沒有可能爲此創建一個玩具項目來展示完整的實現? –

+0

這些是我嘗試使用NIB的存根項目,並試圖沒有: http://jmp.sh/6DdBVdP 我已經得到它與單元格視圖的代碼工作,但與表視圖的代碼。 –

+1

下面是演示的鏈接:http://jmp.sh/ZY9YAWo –

相關問題