gpt4 book ai didi

swift - 是否可以纯粹在代码中创建基于 View 的 NSTableView?

转载 作者:IT王子 更新时间:2023-10-29 05:17:33 26 4
gpt4 key购买 nike

我已经成功地用代码创建了一个基于单元格的 NSTableView。我想让单元格更有趣一点,我读到我需要创建一个基于 View 的 NSTableView。

我上过像this这样的教程.

我的 UI 的其余部分完全在代码中。我一直在尝试为这个 tableview 做同样的事情,但运气不佳。

这是我定义 TableView 的方式——我需要停止注册 Nib,但我不确定如何:

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

tableOfTransactions.headerView = nil

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

这是每个单元格的 stub 代码:

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
}

任何关于如何实现这一目标的指示或建议将不胜感激!

最佳答案

-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
}

如果您的表包含数百行,Cocoa 将尝试重用已经创建但不再显示在屏幕上的 View 。此代码段的第一部分使用 NSTableView 方法来查找此类 View 。如果找不到,则需要从头开始创建一个。

如果你没有理由不这样做,你应该使用 NSTableCellView 的实例(或子类)作为你的 View 。它并没有给 NSView 增加多少,但它的一个关键特性是它保留了对 View 表示的模型的引用(由 -tableView(_:objectValueForTableColumnRow:row: ))。在此示例中,我使用此功能通过绑定(bind)设置文本字段的字符串值。

另一件需要注意的事情是,您应该为您的 View 提供一个标识符,该标识符与您为 View 所在的 NSTableColumn 提供的标识符相匹配。这样做允许您的 TableView 利用上面讨论的可重用 View 功能。

关于swift - 是否可以纯粹在代码中创建基于 View 的 NSTableView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33992756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com