NSTableView 的访问值
Access value of 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
我想要的是一个数组,其中包含 table 的所有字符串,例如:
let array1 = ["Peter","Quinn","1","387","49"]
编辑:
我尝试使用 view base tableView,它有效,我可以在我的数组中获取 textFields。
但是如果通过单击编辑文本字段(将 "Peter" 更改为 "Franck"),它不起作用,NSTextField 在调试实用程序中消失...
let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)?.subviews // return the first TableView
let textFields = firstRowView!.map { [=12=].subviews } as! [[NSTextField]]
let texts = textFields.map {[=12=].first!.stringValue}
print(texts) // let array1 = ["Peter","Quinn","1","387","49"]
如果我手动更改文本,为什么我不再工作了?
这是 "firstRowView" 在我不手动编辑单元格时包含的内容:
下面是 "firstRowView" 包含的内容,当我手动编辑单元格并崩溃时:
您可以看到 NSTableCellView 已转换为 NSView,而我的 textField 已消失...(它仍然存在于 UI 当然...)
首先永远不要从视图(table视图)获取数据,从模型(数据源数组)。
在 macOS 中有一个非常方便的方法。使用 Cocoa 绑定和基于 视图 的 table 视图。除了模型,几乎不需要任何代码。
创建一个模型,class继承自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 中 select table 视图(最简单的方法是 ⌃⇧-单击 进入 table 视图区域和 select Table 查看 ),转到绑定检查器(按 ⌥⌘7) 并将 Content 绑定到 View Controller
并将 Model Key Path 设置为 people
。
然后 select 一个接一个的文本字段 – 再次 ⌃⇧-单击 table 视图中的每个文本字段和 select Table 查看 Cell – 并将 Value 绑定到 Table Cell View
和例如,将 模型关键路径 设置为 objectValue.<property>
就是这样。 table 视图中的所有更改(例如编辑字段)都与模型同步。如果你想获得第二个条目的名字,只需写
let secondFirstName = people[1].firstName
我需要从另一个控制器访问基于单元格的 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
我想要的是一个数组,其中包含 table 的所有字符串,例如:
let array1 = ["Peter","Quinn","1","387","49"]
编辑:
我尝试使用 view base tableView,它有效,我可以在我的数组中获取 textFields。
但是如果通过单击编辑文本字段(将 "Peter" 更改为 "Franck"),它不起作用,NSTextField 在调试实用程序中消失...
let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)?.subviews // return the first TableView
let textFields = firstRowView!.map { [=12=].subviews } as! [[NSTextField]]
let texts = textFields.map {[=12=].first!.stringValue}
print(texts) // let array1 = ["Peter","Quinn","1","387","49"]
如果我手动更改文本,为什么我不再工作了?
这是 "firstRowView" 在我不手动编辑单元格时包含的内容:
下面是 "firstRowView" 包含的内容,当我手动编辑单元格并崩溃时:
您可以看到 NSTableCellView 已转换为 NSView,而我的 textField 已消失...(它仍然存在于 UI 当然...)
首先永远不要从视图(table视图)获取数据,从模型(数据源数组)。
在 macOS 中有一个非常方便的方法。使用 Cocoa 绑定和基于 视图 的 table 视图。除了模型,几乎不需要任何代码。
创建一个模型,class继承自
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 中 select table 视图(最简单的方法是 ⌃⇧-单击 进入 table 视图区域和 select Table 查看 ),转到绑定检查器(按 ⌥⌘7) 并将 Content 绑定到 View Controller
并将 Model Key Path 设置为 people
。
然后 select 一个接一个的文本字段 – 再次 ⌃⇧-单击 table 视图中的每个文本字段和 select Table 查看 Cell – 并将 Value 绑定到 Table Cell View
和例如,将 模型关键路径 设置为 objectValue.<property>
就是这样。 table 视图中的所有更改(例如编辑字段)都与模型同步。如果你想获得第二个条目的名字,只需写
let secondFirstName = people[1].firstName