首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可可NSPopUpButtonCell未显示选定值

可可NSPopUpButtonCell未显示选定值
EN

Stack Overflow用户
提问于 2016-04-01 20:23:10
回答 1查看 436关注 0票数 0

背景

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

我没有成功地使用数据绑定来填充单元数据,因此,我现在正在尝试一种新的方法,使用addItemsWithTitles编程地设置值。

虽然这种方法成功地加载了值,但它未能显示默认选择的值(我对数组的索引0没有意见),也未能在弹出窗口中显示我选择的任何项。

绑定发布

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

我的数据结构是一个简单的类对象,没有核心数据,看起来如下所示。

代码语言:javascript
复制
class Display: NSObject {
    var name: String
    var resolution: String
    var availableResolutions: [String]
}

我想使用availableResolutions数组填充下拉列表。

表中的每一行表示显示对象的实例。我希望NSPopUpButtonCell显示特定显示的availableResolutions列表中的项目。我不确定是否可能为每个显示行都有一个动态列表。

我试过什么

我为我的NSPopUpButtonCell创建了一个NSPopUpButtonCell,并在objectValueForTableColumn和setObjectValue中引用它。我将availableResultions数组添加到objectValueForTableColumn中。

代码语言:javascript
复制
@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()
        }
    }
}

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 22:31:55

与绑定:

将列的Selected Value绑定到arrangedObjectsresolution

将列的Content Values绑定到相同的数组控制器arrangedObjectsavailableResolutions

没有绑定:

数据源方法tableView:objectValueForTableColumn:row:tableView:setObjectValue:forTableColumn:row:处理所选项。委托方法tableView:dataCellForTableColumn:row:处理项。

代码语言:javascript
复制
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
}

附注:我不熟悉斯威夫特。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36365242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档