macos - 在几个 NSTableviews 中呈现字典

标签 macos swift cocoa nsdictionary

我是 cocoa 的初学者,我一直在尝试使用 swift 编程语言为 Mac 制作一个简单的应用程序,但我被卡住了,找不到解决方案。

我想在两个或多个 tableView 中显示来自字典的数据,其中第一个表将显示键,第二个表将显示值。

比如我有一本字典

var worldDict:NSDictionary = ["Africa":["Egypt", "Togo"],"Europe": ["Austria", "Spain"]]

我可以在第一个表中显示所有大陆,但我无法找到如何制作第二个表来显示我在第一个表中选择的大陆的国家/地区。

我的 ViewController 是两个表的数据源和委托(delegate)。

extension ViewController: NSTableViewDataSource {
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    if tableView == continentTable {
    return self.worldDict.valueForKey("Continent")!.count
    } else if tableView == countryTable {
        return self.worldDict.valueForKey("Continent")!.allKeys.count
    }
    return 0
} 
 func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    var cell = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView
    if tableView == self.continentTable {
    let continent: AnyObject? = wordlDict.valueForKey("Continent")
        var keys = continent!.allKeys        
    cell.textField?.stringValue = keys[row] as! String
    } else if tableView == self.countryTable {
        var countriesOfContinent: AnyObject? = worldDict.valueForKey("Continent")?.valueForKey("Africa")!
        cell.textField?.stringValue = countriesOfContinent?.allKeys[row] as! String
    }
        return cell
}

在这里,我在表格中显示字典中的数据,但分开显示,并且无法弄清楚如何使它们一起工作。

我也知道如何获取已选择的行数

extension ViewController: NSTableViewDelegate {

func tableViewSelectionDidChange(notification: NSNotification) {
    let continentSelected = rowSelected()
}}
func rowSelected() -> Int? {
    let selectedRow = self.continentTable.selectedRow
    if selectedRow >= 0 && selectedRow < self.worldDict.valueForKey("Continent")!.count {
        return selectedRow
    }
    return nil
}

最佳答案

部分问题在于您依赖 allKeys() 返回的键的顺序是可靠的,但事实并非如此。您需要保留一个单独的大洲数组。它基本上可以是一次返回的任何 allKeys() 的副本,但您不应该每次都调用 allKeys()

numberOfRowsInTableView() 中,对于国家表,您想要返回所选大陆的国家数:

} else if tableView == countryTable {
    if let selectedContinentRow = rowSelected() {
        let selectedContinent = continentsArray[selectedContinentRow]
        return self.worldDict[selectedContinent].count
    }
    return 0
}

对于 tableView(_:viewForTableColumn:row:),您想要从所选大洲的国家/地区数组中返回一个元素:

} else if tableView == self.countryTable {
    if let selectedContinentRow = rowSelected() {
        let selectedContinent = continentsArray[selectedContinentRow]
        return self.worldDict[selectedContinent][row]
    }
}

此外,每当所选大陆发生变化时,您需要告诉国家/地区表重新加载其数据:

func tableViewSelectionDidChange(notification: NSNotification) {
    // ... whatever else ...
    let tableView = notification.object as! NSTableView
    if tableView == continentTable {
        countryTable.reloadData()
    }
}

关于macos - 在几个 NSTableviews 中呈现字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631818/

相关文章:

ios - 如何真正执行CoreData重量级迁移

objective-c - NSTextField子类textDidEndEditing : Deleting Text

macos - NSControl的setCellClass在OS X 10.10中已弃用。替代NSTextField的单元类的替代方法是什么?

ios - 在 Swift 中动态创建对象

ios - Swift:UISlider 轨道的一侧未圆角

objective-c - 使用 Interface Builder 添加的 NSImageView 为 null

objective-c - 用于评估字符串的 NSPredicate

python - 在 Anaconda Jupyter Notebook (MAC OSX) 中加载 rpy2 时出现导入错误

c++ - 已部署的 Mac 应用程序无法在 2014 年底之前的 Mac 上打开

ios - Swift 字典获取值的键