swift 3 - 带有更多文本字段的表格视图单元格

swift 3 - tableview cell with more textfield

我在 macOS 上使用 swift 3,我有一个表格视图,它将填充如下数据:

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?

视情况而定。

首先NSTableViewUITableView多才多艺。

在基于 table 的视图中,您可以将所有内容用作继承自 NSView 的视图。这可以是单个 NSTextField(不包含视图)一个专用的 NSTableCellView 实例,有或没有额外的内容或有自定义内容的自定义视图。

您还可以使用包含全部内容的单个列或多个列。

您的数据源是一维的,每行只有一个值。要分配多个值,您需要一个模型,例如自定义 class(class – 而不是结构 – 需要能够使用 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 中只是 return 给定行的 Person 实例

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return people[row]
    }
    
  • macOS 魔法来了:在 Interface Builder 中打开 Bindings Inspector (⌥⌘7) 并绑定每个文本字段的 Value Table Cell ViewModel Key PathobjectValue.firstNameobjectValue.lastNameobjectValue.email.

绑定将模型属性动态连接到文本字段的字符串值。对于具有多个 UI 元素的单列或分别具有单个元素的多列,过程是相同的。