Swift Cocoa NSPopUpButtonCell未显示选定值

Swift Cocoa NSPopUpButtonCell未显示选定值,swift,cocoa,nstableview,cocoa-bindings,nspopupbuttoncell,Swift,Cocoa,Nstableview,Cocoa Bindings,Nspopupbuttoncell,背景 我有一个NSTableView,有3列,其中一列有一个NSPopUpButtonCell 我在使用数据绑定填充单元格数据方面一直不成功,因此我现在正在尝试一种新方法,通过编程方式使用addItemsWithTitles设置值 虽然这种方法可以加载值,但它无法显示默认选择的值(我对数组的索引0没有意见),也无法显示我在弹出窗口中选择的任何项目 绑定问题 文档建议使用绑定,并提供了一个使用核心数据在弹出窗口中加载关系数据的示例。虽然我的应用程序设置不同,但我仍然尝试使用数组控制器,但这不会填充

背景

我有一个NSTableView,有3列,其中一列有一个NSPopUpButtonCell

我在使用数据绑定填充单元格数据方面一直不成功,因此我现在正在尝试一种新方法,通过编程方式使用addItemsWithTitles设置值

虽然这种方法可以加载值,但它无法显示默认选择的值(我对数组的索引0没有意见),也无法显示我在弹出窗口中选择的任何项目

绑定问题

文档建议使用绑定,并提供了一个使用核心数据在弹出窗口中加载关系数据的示例。虽然我的应用程序设置不同,但我仍然尝试使用数组控制器,但这不会填充popUpButtoncell中的数据

我的数据结构是一个简单的类对象,没有核心数据,看起来是这样的

class Display: NSObject {
    var name: String
    var resolution: String
    var availableResolutions: [String]
}
我想使用availableResolutions数组填充下拉列表

我的表格中的每一行都代表显示对象的一个实例。我希望NSPopUpButtonCell显示该特定显示器的可用解决方案列表中的项目。我不确定是否有可能为每个显示行创建一个动态列表

我尝试过的

我为NSPopUpButtonCell创建了一个IBOutlet,并在objectValueForTableColumn和setObjectValue中引用它。我在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()
        }
    }
}
我缺少什么?

带有绑定:

将列的
选定值
绑定到
排列对象
分辨率

将列的
内容值
绑定到同一数组控制器,
排列对象
可用解决方案

无绑定:

数据源方法
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、 我不熟悉Swift。

您确定调用了objectValueForTableColumn和setObjectValue吗?这些不是用于基于单元格的表视图吗?您很可能有一个基于视图的表视图。内容模式设置为基于单元格。我可以确认调用了objectValueForTableColumn,因为其他列的数据实际上已填充。此外,如果我修改表中的任何数据,setObjectValue也会被调用并起作用。这为我指明了正确的方向。我需要在ObjectValueForTable列中返回indexOf。首先,我检查display.availableResolutions.indexOf(display.resolution)是否为零。如果是,则返回列表中的第一项,否则返回上面的内容。非常感谢。