Swift NSTableView的访问值

Swift NSTableView的访问值,swift,cocoa,nstableview,Swift,Cocoa,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 textFie

我需要从另一个控制器访问基于单元格的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

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

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

我尝试使用视图库tableView,它可以工作,我可以在数组中获取文本字段。
但是,如果通过单击文本字段(将“Peter”更改为“Franck”)来编辑文本字段,它将不起作用,NSTextField将在调试实用程序中消失

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

print(texts) // let array1 = ["Peter","Quinn","1","387","49"]
如果我手动更改文本,为什么不再工作

以下是我不手动编辑单元格时“firstRowView”包含的内容:

以下是我手动编辑单元格并使其崩溃时“firstRowView”所包含的内容:


您可以看到NSTableCellView已转换为NSView,并且我的文本字段已消失。。。(当然,它仍然在UI中…

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

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

  • 创建模型时,必须使用继承自
    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中,首先选择表视图(最简单的方法是⌃⇧-单击表格视图区域并选择表格视图),转到绑定检查器(按⌥⌘7) 并将内容绑定到
查看控制器
,并将模型密钥路径设置为
人物

然后逐个选择文本字段–再次选择⌃⇧-单击表格视图中的每个文本字段,然后选择表格视图单元格–并将值绑定到
表格单元格视图
,并将模型键路径设置为
对象值。
例如

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

let secondFirstName = people[1].firstName

首先,不要从视图(表视图)获取数据,而是从模型(数据源数组)获取数据

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

  • 创建模型时,必须使用继承自
    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中,首先选择表视图(最简单的方法是⌃⇧-单击表格视图区域并选择表格视图),转到绑定检查器(按⌥⌘7) 并将内容绑定到
查看控制器
,并将模型密钥路径设置为
人物

然后逐个选择文本字段–再次选择⌃⇧-单击表格视图中的每个文本字段,然后选择表格视图单元格–并将值绑定到
表格单元格视图
,并将模型键路径设置为
对象值。
例如

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

let secondFirstName = people[1].firstName

你不能从数据源获取数据吗?数据现在设置在情节提要中,我可以(而且我需要)通过键盘编辑单元格直接编辑数据。你计划将来使用数据源或Cocoa绑定吗?你不能从数据源获取数据吗?数据现在设置在情节提要中,我可以(而且我需要)通过键盘编辑单元格直接编辑数据。您是否计划将来使用数据源或Cocoa绑定?谢谢,我从未使用过Cocoa绑定,但它似乎很棒。谢谢,我从未使用过Cocoa绑定,但它似乎很棒。