Swift 访问结构中的数据以在NSTableView中使用
我对编程相当陌生,我已经在这上面呆了一段时间了。我有一个名为Patient的结构,它充满了变量,例如var FIRST:String 我已经编写了从JSON检索数据并填充此结构的代码。它工作正常,我可以调用print(患者)并在控制台中查看所有数据 该结构的实例是一个2d数组,因此当我打印到控制台时,我会得到Patient(第一个:“Bob”,最后一个:“Smith”)Patient(第一个:“Dave”,最后一个:“Evans”)Patient(第一个:“Liz”,最后一个:“Taylor”) 第一个tableview方法工作正常,并返回3的计数 第二个是我被困的地方: 我宣布:Swift 访问结构中的数据以在NSTableView中使用,swift,macos,uitableview,struct,Swift,Macos,Uitableview,Struct,我对编程相当陌生,我已经在这上面呆了一段时间了。我有一个名为Patient的结构,它充满了变量,例如var FIRST:String 我已经编写了从JSON检索数据并填充此结构的代码。它工作正常,我可以调用print(患者)并在控制台中查看所有数据 该结构的实例是一个2d数组,因此当我打印到控制台时,我会得到Patient(第一个:“Bob”,最后一个:“Smith”)Patient(第一个:“Dave”,最后一个:“Evans”)Patient(第一个:“Liz”,最后一个:“Taylor”)
static var globalPatientInstance: [Patient] = []
然后,使用完成处理程序中的数据填充。下面是第二种方法:
extension ViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let item = ViewController.globalPatientInstance[row]
let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
cell?.textField?.stringValue = item[(tableColumn?.identifier)!]!
return cell!
}
}
这将给出“类型“Patient”没有下标成员”
但是,如果我将行更改为:
cell?.textField?.stringValue = item.FIRST
代码将运行,我在表视图中得到三行,每行有不同的名称-Bob、Dave、Liz
获取其余数据的正确方法是什么,即最后显示的项目
感谢您的帮助,我尝试了很多不同的方法,但我真的被困在了这个问题上。“键入“Patient”没有下标成员”-此错误是因为您试图以数组的形式访问Patient。项是结构,而不是数组
当你说你的结构是一个二维数组时,这是没有意义的。您的结构是一个结构。“2D”数组只是结构的全局实例变量数组。[患者]是一个一维阵列
let item = ViewController.globalPatientInstance[row] // item is now a Patient struct
let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
cell?.textField?.stringValue = item[(tableColumn?.identifier)!]! // This doesn't work because Patient is not an array, but a struct
cell?.textField?.stringValue = item.FIRST // This works because you are accessing the property of item
cell?.textField?.stringValue = item.LAST // This is to display the LAST property of item
return cell!
}
注意--请将类属性命名为camelCase。。您可以将此样式指南用作新手参考
此外,使用first和last是不好的属性命名约定,因为它听起来像first是数组的第一个元素。我会推荐firstName和lastName。我猜出来了。谢谢你们的帮助。此方法满足我的需要:
extension ViewController: NSTableViewDelegate {
fileprivate enum CellIdentifiers {
static let firstName = "FIRST"
static let lastName = "LAST"
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
var cellValue: String = ""
var cellIdentifier: String = ""
let item = ViewController.globalPatientInstance[row]
if tableColumn == tableView.tableColumns[0] {
cellValue = item.FIRST
cellIdentifier = CellIdentifiers.firstName
}
else if tableColumn == tableView.tableColumns[1] {
cellValue = item.LAST
cellIdentifier = CellIdentifiers.lastName
}
if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: nil) as? NSTableCellView {
cell.textField?.stringValue = cellValue
//cell.textField?.stringValue = lastName
return cell
}
return nil
}
}
在单元格中添加第二个文本字段,或将两个字段连接成一个字符串,并在文本字段中使用该字符串谢谢您的回复!关于命名,它与我从JSON URL获得的名称相匹配,但我同意你的观点。我知道我有一个结构,我需要一个数组。我坚持的是从a到b的最好方式。我确实使用了.map将名称提取到单独的数组中,但我不知道如何将其合并回一个数组中,以便在考虑任何nil值的同时提供给表视图。感谢您的帮助!我不明白你为什么需要阵列?你想完成什么?每行有一个项目。