Какао NSPopUpButtonCell не отображает выбранное значение
Фон
У меня есть NSTableView с 3 столбцами, один из них имеет NSPopUpButtonCell.
Мне не удалось использовать привязки данных для заполнения данных ячейки, поэтому я сейчас пытаюсь использовать новый подход, устанавливая значения программно с помощью addItemsWithTitles.
Хотя этот подход работал для загрузки значений, он не отображает выбранную по умолчанию (я в порядке с индексом 0 моего массива), а также не отображает любой элемент, выбранный во всплывающем окне.
Проблема привязок
Документация предлагает использовать привязки и предоставляет пример использования Core Data для загрузки реляционных данных во всплывающем окне. Хотя мое приложение настроено по-другому, я все еще пытался использовать контроллер массива, но это не заполнило бы данные в popUpButtoncell.
Моя структура данных представляет собой простой объект класса, без основных данных, и это выглядит так.
class Display: NSObject {
var name: String
var resolution: String
var availableResolutions: [String]
}
Я хотел бы использовать массив availableResolutions для заполнения раскрывающегося списка.
Каждая строка в моей таблице представляет экземпляр объекта Display. Я хочу, чтобы NSPopUpButtonCell отображал элементы в списке доступных разрешений данного дисплея. Я не уверен, возможно ли вообще иметь динамический список для каждой строки отображения.
Что я пробовал
Я создал IBOutlet для моего NSPopUpButtonCell, и я ссылаюсь на него в objectValueForTableColumn и setObjectValue. Я добавляю массив availableResultions внутри objectValueForTableColumn.
@IBOutlet weak var popUpCell: NSPopUpButtonCell!
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return self.displays.count
}
func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {
let display = displays[row]
if tableColumn!.identifier == "displayCell" {
return display.name
}
else if tableColumn!.identifier == "resolutionCell" {
return display.resolution
}
else {
self.popUpCell.addItemsWithTitles(display.availableResolutions!)
return display.availableResolutions
}
}
func tableView(tableView: NSTableView, setObjectValue object: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row: Int) {
if tableColumn!.identifier == "displayCell" {
displays[row].name = object as! String
}
else if tableColumn!.identifier == "resolutionCell" {
object as! String
}
else {
let index = object as! Int
if index >= 0 {
self.popUpCell.selectItemAtIndex(index)
self.popUpCell.synchronizeTitleAndSelectedItem()
}
}
}
Что мне не хватает?
1 ответ
С привязками:
привязывать Selected Value
колонны в arrangedObjects
, resolution
,
привязывать Content Values
столбца к тому же контроллеру массива, arrangedObjects
, availableResolutions
,
Без привязок:
Методы источника данных tableView:objectValueForTableColumn:row:
а также tableView:setObjectValue:forTableColumn:row:
разобраться с выбранным предметом. Метод делегата tableView:dataCellForTableColumn:row:
занимается с предметами.
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return self.displays.count
}
func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {
let display = displays[row]
if tableColumn!.identifier == "displayCell" {
return display.name
}
else if tableColumn!.identifier == "resolutionCell" {
return display.availableResolutions.indexOf(display.resolution)
}
return nil
}
func tableView(tableView: NSTableView, setObjectValue object: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row: Int) {
let display = displays[row]
if tableColumn!.identifier == "displayCell" {
display.name = object as! String
}
else if tableColumn!.identifier == "resolutionCell" {
display.resolution = display.availableResolutions[object as! Int]
}
}
func tableView(tableView: NSTableView, dataCellForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSCell? {
if let cell = tableColumn?.dataCellForRow(row) as? NSCell {
if tableColumn!.identifier == "resolutionCell" {
if let popupButtonCell = cell as? NSPopUpButtonCell {
popupButtonCell.removeAllItems()
popupButtonCell.addItemsWithTitles(displays[row].availableResolutions)
}
}
return cell
}
return nil
}
ps я не знаком со Swift.