我需要从另一个控制器访问基于我的单元格的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。 但是如果通过单击它来编辑文本字段(通过“Franck”更改“Peter”),它就不起作用,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”包含的内容:
您可以看到NSTableCellView被转换为NSView并且我的textField已经消失了......(当然它仍然存在于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中首先选择表视图(最简单的方法是^ - 单击进入表视图区域并选择Table View),转到Bindings Inspector(按⌥⌘7)并将内容绑定到View Controller
并设置Model Key Path到people
。
然后逐个选择文本字段 - 再次^_-单击表视图中的每个文本字段并选择表视图单元格 - 并将值绑定到Table Cell View
并将模型键路径设置为objectValue.<property>
例如
就这样。表视图中的所有更改(例如编辑字段)都与模型同步。如果你想获得第二个条目的第一个名字,只需写
let secondFirstName = people[1].firstName