NSTableView的访问值

问题描述 投票:0回答:1

我需要从另一个控制器访问基于我的单元格的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。 但是如果通过单击它来编辑文本字段(通过“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”包含的内容:enter image description here

这是我手动编辑单元格时崩溃的“firstRowView”:enter image description here

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

swift cocoa nstableview
1个回答
2
投票

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

在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

enter image description here

然后逐个选择文本字段 - 再次^_-单击表视图中的每个文本字段并选择表视图单元格 - 并将值绑定到Table Cell View并将模型键路径设置为objectValue.<property>例如

enter image description here

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

let secondFirstName = people[1].firstName
© www.soinside.com 2019 - 2024. All rights reserved.