我需要从另一个控制器访问基于单元格的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,它可以工作,我可以在数组中获取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”包含的内容是:
这是当我手动编辑单元格并使其崩溃时“ firstRowView”包含的内容:
您可以看到NSTableCellView转换为NSView并且我的textField已经消失了……(当然它仍然在UI中……)
答案 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
。
然后一个一个地选择文本字段-再次 ⌃⇧-单击在表视图中的每个文本字段上,然后选择 表视图单元格 > –将 Value 绑定到Table Cell View
,然后将 Model Key Path 设置为objectValue.<property>
仅此而已。表格视图中的所有更改(例如,编辑字段)都与模型同步。如果要获取第二个条目的名字,只需输入
let secondFirstName = people[1].firstName