我使用swift 3 for macOS并且我有一个tableview,它将填充这样的数据:
var test = ["Person 1","Person 2","Person 3"]
func numberOfRows(in tableView: NSTableView) -> Int {
return test.count
}
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
return ("\(test[row]) \(test[row])")
}
这很好用。但是,如果每个单元格有多个文本字段,我如何填充数据?
如何将值分配给每个单元格的正确文本字段?
在iOS中,有一个原型单元和自定义单元的解决方案。 但它对macOS有何用处?
答案 0 :(得分:1)
取决于。
首先,NSTableView
比UITableView
更通用。
在基于视图的表视图中,您可以将所有内容用作继承自NSView
的视图。这可以是单个NSTextField
(没有封闭视图)专用NSTableCellView
实例,包含或不包含其他内容,也可以是包含自定义内容的自定义视图。
您还可以使用包含整个内容或多列的单个列。
您的数据源是一维的,每行只有一个值。要分配多个值,您需要一个模型,例如自定义类(需要一个类 - 而不是结构 - 才能使用Cocoa绑定)。
假设您有三列标准NSTableCellView
实例。
创建模型
class Person {
let firstName, lastName, email : String
init(firstName ...
}
在控制器中创建一个包含Person
实例
var people = [Person]()
方法numberOfRows
未经修改
func numberOfRows(in tableView: NSTableView) -> Int {
return people.count
}
在方法objectValueFor
中,只返回给定行的Person
实例
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
return people[row]
}
现在出现了macOS魔术:在界面生成器中打开Bindings Inspector(⌥⌘7)并将每个文本字段的Value
绑定到Table Cell View
, Model Key Path
至objectValue.firstName
,objectValue.lastName
或objectValue.email
。
Bindings将模型属性动态连接到文本字段的字符串值。具有多个UI元素的单个列或具有单个元素的多个列的过程相同。