2016-04-01 3 views
0

фонкакао NSPopUpButtonCell не отображает выбранное значение

У меня есть NSTableView с 3-мя колоннами, одна из них имеет NSPopUpButtonCell.

У меня не получилось использовать привязки данных для заполнения данных ячеек, поэтому я теперь пытаюсь использовать новый подход, задавая значения программным путем с помощью addItemsWithTitles.

Хотя этот подход сработал для загрузки значений, он не отображает выбранный по умолчанию (я в порядке с индексом 0 моего массива), а также не отображает любой элемент, который я выбираю во всплывающем окне.

Bindings Выпуск

В Документации предлагает использовать привязки и представляет собой пример с использованием основных данных для загрузки реляционных данных во всплывающем окне. Хотя мое приложение настроено по-другому, я все же пытался использовать контроллер массива, но это не заполнило бы данные в popUpButtoncell.

Моя структура данных - это простой объект класса, без данных ядра, и это выглядит так.

class Display: NSObject { 
    var name: String 
    var resolution: String 
    var availableResolutions: [String] 
} 

Я бы хотел использовать массив доступных массивов, чтобы заполнить выпадающий список.

Каждая строка в моей таблице представляет экземпляр объекта Display. Я хочу, чтобы NSPopUpButtonCell отображал элементы в этом конкретном списке доступных доступных Решений. Я не уверен, возможно ли иметь динамический список для каждой строки Display.

То, что я пытался

Я создал IBOutlet для моего NSPopUpButtonCell и я ссылаться на него в objectValueForTableColumn и setObjectValue. Я добавляю массив доступныхResultions внутри 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() 
     } 
    } 
} 

Что мне не хватает?

+0

Вы уверены, что objectValueForTableColumn и setObjectValue вызываются? Разве это не для табличных таблиц? У вас, скорее всего, есть табличное представление на основе представления. – user965972

+0

Режим содержимого настроен для Cell Based. Я могу подтвердить, что objectValueForTableColumn вызывается, поскольку данные для других столбцов фактически заполнены.Кроме того, вызывается setObjectValue и работает, если я изменяю какие-либо данные в таблице. –

ответ

0

С привязок:

Bind Selected Value колонки для arrangedObjects, resolution.

Bind Content Values колонки к тому же контроллеру массива, arrangedObjects, availableResolutions.

Без привязки:

Методы DataSource 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 
} 

p.s. Я не знаком с Свифтом.

+0

Это указывало мне в правильном направлении. Мне нужно было вернуть indexOf в objectValueForTableColumn. Сначала я проверяю, является ли display.availableResolutions.indexOf (display.resolution) нулевым. Если это так, я возвращаю первый элемент в списке, иначе я верну выше. Спасибо! –

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