使用Swift中的Bindings以编程方式创建基于NSTableView的视图
发布时间:2020-12-14 04:33:54 所属栏目:百科 来源:网络整理
导读:我正在通过 Swift书中的Cocoa工作,我被困在关于Bindings的章节中.本书使用nib文件,但我想以编程方式完成所有操作(因为我加入了一个不使用nib的团队).该项目是创建一个基于视图的表,其中包含2列,表的内容绑定到数组控制器的arrangeObjects.数组控制器的内容绑
我正在通过
Swift书中的Cocoa工作,我被困在关于Bindings的章节中.本书使用nib文件,但我想以编程方式完成所有操作(因为我加入了一个不使用nib的团队).该项目是创建一个基于视图的表,其中包含2列,表的内容绑定到数组控制器的arrangeObjects.数组控制器的内容绑定到Employee对象数组(Employee有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,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 如您所见,我不知道该表是基于单元格还是基于视图.我怎么知道我的桌子是基于什么的?由于本章是关于Bindings的,因此没有使用任何委托或数据源方法,我也想这样做. 下一个问题: 解决方法
我在回答我自己的问题.请注意,我是初学者,不知道这是否是正确的做事方式.正如用户stevesilva在上述问题的评论中所指出的,我不得不实现委托方法tableView:viewForTableColumn:row:以确保该表是基于视图的.在委托方法中,我尝试创建一个NSTableCellView并绑定textField属性,但这不起作用.我不得不继承NSTableCellView,创建一个新的文本字段属性,然后绑定该属性.这是我的代表最终看来的样子.
func tableView(tableView: NSTableView,viewForTableColumn tableColumn: NSTableColumn?,row: Int) -> NSView? { let frameRect = NSRect(x: 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",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") } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |