NSTableView的访问值

时间:2019-02-15 01:49:55

标签: 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 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

enter image description here

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

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

编辑:

我尝试过使用视图库 tableView,它可以工作,我可以在数组中获取textFields。
但是,如果通过单击它来编辑文本字段(将“ 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”包含的内容是: enter image description here

这是当我手动编辑单元格并使其崩溃时“ firstRowView”包含的内容: enter image description here

您可以看到NSTableCellView转换为NSView并且我的textField已经消失了……(当然它仍然在UI中……)

1 个答案:

答案 0 :(得分:2)

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

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

  • 创建模型,必须继承自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)并将 Content 绑定到View Controller并将 Model Key Path 设置为people

enter image description here

然后一个一个地选择文本字段-再次 ⌃⇧-单击在表视图中的每个文本字段上,然后选择 表视图单元格 > –将 Value 绑定到Table Cell View,然后将 Model Key Path 设置为objectValue.<property>

enter image description here

仅此而已。表格视图中的所有更改(例如,编辑字段)都与模型同步。如果要获取第二个条目的名字,只需输入

let secondFirstName = people[1].firstName