gpt4 book ai didi

swift - 在 Swift 中使用绑定(bind)以编程方式创建基于 View 的 NSTableView

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:48 25 4
gpt4 key购买 nike

我正在阅读一本 Cocoa in Swift 的书,但我卡在了有关绑定(bind)的一章中。这本书使用 nib 文件,但我想以编程方式完成所有操作(因为我加入了一个不使用 nib 的团队)。该项目是创建一个包含 2 列的基于 View 的表格,表格的内容绑定(bind)到数组 Controller 的 arrangedObjects。数组 Controller 的内容绑定(bind)到一个 Employee 对象数组(Employee 有 2 个属性,即 name 和 salary)。

我能够像下面这样以编程方式创建表格(一个 ScrollView 、一个表格 View 、2 个表格列):

let tableWidth = windowWidth! * 0.6
let tableHeight = windowHeight! * 0.8

scrollView = NSScrollView(frame: NSRect(x: windowWidth!*0.05, y: windowHeight!*0.08, width: tableWidth, height: tableHeight))

employeeTable = NSTableView(frame: NSRect(x: 0, y: 0, width: tableWidth, height: tableHeight))
employeeTable?.bind("content", toObject: (self.arrayController)!, withKeyPath: "arrangedObjects", options: nil)

nameColumn = NSTableColumn(identifier: "name column")
nameColumn?.width = tableWidth * 0.4
nameColumn?.headerCell.title = "Name"

raiseColumn = NSTableColumn(identifier: "raise column")
raiseColumn?.width = tableWidth * 0.6
raiseColumn?.headerCell.title = "Raise"

employeeTable?.addTableColumn(nameColumn!)
employeeTable?.addTableColumn(raiseColumn!)
employeeTable?.setDelegate(self)

scrollView?.documentView = employeeTable

如您所见,我不知道此表是基于单元格还是基于 View 。我怎么知道我的表是基于什么的?由于本章是关于绑定(bind)的,因此没有使用任何委托(delegate)或数据源方法,我也想这样做。

下一个问题:就像我说的,这本书使用了 NIB,并且已经准备好访问它下面的 NSTableView、NSTableCellView 和 NSTextField。首先,NSTableView 的内容绑定(bind)到数组 Controller 的 arrangedObjects。因为我自己在代码中创建了 tableView 对象,所以我能够以编程方式完成这一部分。然后,本书将 NSTextField 的值绑定(bind)到 NSTableCellView 的 objectValue.name(名称是 Employee 对象的属性之一)。由于我没有在我的代码中创建这些 NSTableCellView 和 NSTextField 对象,我该怎么做呢?有没有办法访问它们(假设我的表甚至是基于 View 的)?

最佳答案

我正在回答我自己的问题。请注意,我是初学者,不知道这是否是正确的做事方式。正如用户 stevesilva 在上述问题的评论中指出的那样,我必须实现委托(delegate)方法 tableView:viewForTableColumn:row: 以确保该表是基于 View 的。在委托(delegate)方法中,我尝试创建一个 NSTableCellView 并绑定(bind) textField 属性,但这没有用。我必须继承 NSTableCellView,创建一个新的文本字段属性,然后绑定(bind)该属性。这就是我的代表最终的样子。

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

let frameRect = NSRect(x: 0, y: 0, width: tableColumn!.width, height: 20)

let tableCellView = MyTableCellView(frame: frameRect)

if tableColumn?.identifier == "name column" {
tableCellView.aTextField?.bind("value", toObject: tableCellView, withKeyPath: "objectValue.name", options: nil)
} else if tableColumn?.identifier == "raise column" {
tableCellView.aTextField?.bind("value", toObject: tableCellView, withKeyPath: "objectValue.raise", options: nil)
}

return tableCellView
}

这是我的子类 NSTableCellView:

class MyTableCellView: NSTableCellView {

var aTextField: NSTextField?

override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
aTextField = NSTextField(frame: frameRect)
aTextField?.drawsBackground = false
aTextField?.bordered = false
self.addSubview(aTextField!)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

关于swift - 在 Swift 中使用绑定(bind)以编程方式创建基于 View 的 NSTableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583638/

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