Swift NSTableView的访问值
我需要从另一个控制器访问基于单元格的TableView的值。我在主控制器中执行此代码,而tableView在子控制器中。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
这是我做的,但我得到零
// 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)] }
查看控制器
,并将模型密钥路径设置为人物
然后逐个选择文本字段–再次选择⌃⇧-单击表格视图中的每个文本字段,然后选择表格视图单元格–并将值绑定到表格单元格视图
,并将模型键路径设置为对象值。
例如
就这些。表视图中的所有更改(例如编辑字段)都与模型同步。如果你想得到第二个条目的名字,只需写
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)] }
查看控制器
,并将模型密钥路径设置为人物
然后逐个选择文本字段–再次选择⌃⇧-单击表格视图中的每个文本字段,然后选择表格视图单元格–并将值绑定到表格单元格视图
,并将模型键路径设置为对象值。
例如
就这些。表视图中的所有更改(例如编辑字段)都与模型同步。如果你想得到第二个条目的名字,只需写
let secondFirstName = people[1].firstName
你不能从数据源获取数据吗?数据现在设置在情节提要中,我可以(而且我需要)通过键盘编辑单元格直接编辑数据。你计划将来使用数据源或Cocoa绑定吗?你不能从数据源获取数据吗?数据现在设置在情节提要中,我可以(而且我需要)通过键盘编辑单元格直接编辑数据。您是否计划将来使用数据源或Cocoa绑定?谢谢,我从未使用过Cocoa绑定,但它似乎很棒。谢谢,我从未使用过Cocoa绑定,但它似乎很棒。