2015-07-25 2 views
1

Я новичок в какао, и я пытался создать простое приложение для Mac, используя быстрый язык программирования, но я застрял и не могу найти решение.Настоящий словарь в нескольких NSTableviews

Я хочу представить данные из словаря в двух или более таблицах, где первая таблица будет показывать ключ, а вторая таблица будет показывать значение.

Например, у меня есть словарь

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

Я могу представить все континенты в первой таблице, но я не могу узнать, как сделать вторую таблицу для отображения стран континента я выбираю в первую Таблица.

My ViewController - это DataSource и делегат для обеих таблиц.

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 
} 
+0

Почему бы вам не поделиться тем, что вы сделали, чтобы получить первое представление таблицы и что вы пытались получить во втором представлении таблицы? Кроме того, опишите точно, что второе представление таблицы не работает так, как вы хотите. –

+0

@KenThomases Я добавил выдержки из кода. – Alex

+0

Какова связь между 'var countries' и' worldfDict'? –

ответ

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] 
    } 
} 

Кроме того, всякий раз, когда выбранные изменения континента, вы должны указать таблицу стран, чтобы перезагрузить его данные:

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

Теперь он отлично работает, спасибо вам за помощь. – Alex

Смежные вопросы