Какао 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.

Другие вопросы по тегам