在几个NSTableviews中呈现字典

时间:2015-07-25 22:40:24

标签: macos swift cocoa nsdictionary

我是可可的初学者,我一直在尝试使用swift编程语言为Mac制作一个简单的应用程序,但我陷入困境,无法找到解决方案。

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

例如,我有一本字典

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

我可以在第一张桌子中展示所有大陆,但我无法找到如何制作第二张桌子以显示我在第一张桌子中选择的大陆的国家。

我的ViewController是两个表的DataSource和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
}

1 个答案:

答案 0 :(得分:0)

部分问题在于,您依靠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]
    }
}

此外,每当选定的大陆发生变化时,您需要告诉countries表重新加载其数据:

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