NSTableView 的访问值

Access value of NSTableView

我需要从另一个控制器访问基于单元格的 TableView 的值。我在主控制器中执行此代码,tableView 在子控制器中。
这是我所做的,但我没有得到...

// First grab the tableView controller
let myTableViewController = self.children[0] as! MyTableViewController

// Now I want to access the first row to get values of the textFields
let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)

//Let's try another way :
let firstView = myTableViewController.theTable.view(atColumn: 0, row: 0, makeIfNecessary: true)

//I can't do more because "firstRowView" and "firstView " are nil

我想要的是一个数组,其中包含 table 的所有字符串,例如:

let array1 = ["Peter","Quinn","1","387","49"]

编辑:

我尝试使用 view base tableView,它有效,我可以在我的数组中获取 textFields。
但是如果通过单击编辑文本字段(将 "Peter" 更改为 "Franck"),它不起作用,NSTextField 在调试实用程序中消失...

let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)?.subviews // return the first TableView
let textFields = firstRowView!.map { [=12=].subviews } as! [[NSTextField]]
let texts = textFields.map {[=12=].first!.stringValue}

print(texts) // let array1 = ["Peter","Quinn","1","387","49"]

如果我手动更改文本,为什么我不再工作了?

这是 "firstRowView" 在我不手动编辑单元格时包含的内容:

下面是 "firstRowView" 包含的内容,当我手动编辑单元格并崩溃时:

您可以看到 NSTableCellView 已转换为 NSView,而我的 textField 已消失...(它仍然存在于 UI 当然...)

首先永远不要从视图(table视图)获取数据,从模型(数据源数组)。

在 macOS 中有一个非常方便的方法。使用 Cocoa 绑定和基于 视图 的 table 视图。除了模型,几乎不需要任何代码。

  • 创建一个模型,class继承自NSObject是强制性的,以利用键值编码

    @objcMembers
    class Person : NSObject {
        dynamic var firstName, lastName : String
        dynamic var age : Int
        dynamic var number1, number2 : Int
    
        init(firstName : String, lastName : String, age : Int, number1 : Int, number2 : Int) {
            self.firstName = firstName
            self.lastName = lastName
            self.age = age
            self.number1 = number1
            self.number2 = number2
        }
    }
    
  • 声明一个数据源数组

    @objc dynamic var people = [Person]()
    
  • 并填充它

    override func viewDidLoad() {
        super.viewDidLoad()
        people = [Person(firstName: "Peter", lastName: "Quinn", age: 1, number1: 387, number2: 49),
                  Person(firstName: "Peter", lastName: "Quinn", age: 1, number1: 387, number2: 49)]
    }
    

这就是全部代码。现在进行绑定。

首先在 Interface Builder 中 select table 视图(最简单的方法是 ⌃⇧-单击 进入 table 视图区域和 select Table 查看 ),转到绑定检查器(按 ⌥⌘7) 并将 Content 绑定到 View Controller 并将 Model Key Path 设置为 people

然后 select 一个接一个的文本字段 – 再次 ⌃⇧-单击 table 视图中的每个文本字段和 select Table 查看 Cell – 并将 Value 绑定到 Table Cell View 和例如,将 模型关键路径 设置为 objectValue.<property>

就是这样。 table 视图中的所有更改(例如编辑字段)都与模型同步。如果你想获得第二个条目的名字,只需写

let secondFirstName = people[1].firstName