swift 3 - 具有更多文本字段的tableview单元格

时间:2017-05-12 06:21:27

标签: macos swift3 nstableview

我使用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有何用处?

1 个答案:

答案 0 :(得分:1)

取决于。

首先,NSTableViewUITableView更通用。

在基于视图的表视图中,您可以将所有内容用作继承自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 ViewModel Key PathobjectValue.firstNameobjectValue.lastNameobjectValue.email

Bindings将模型属性动态连接到文本字段的字符串值。具有多个UI元素的单个列或具有单个元素的多个列的过程相同。