2015-11-30 34 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 –

相关问题