Cocoa NSPopUpButtonCell 未显示所选值
Cocoa NSPopUpButtonCell not displaying selected value
背景
我有一个包含 3 列的 NSTableView,其中一列有一个 NSPopUpButtonCell。
我一直未能成功使用数据绑定来填充单元格数据,因此我现在正在尝试一种新方法,通过使用 addItemsWithTitles 以编程方式设置值。
虽然这种方法可以加载值,但它无法显示默认的 selected(我可以使用数组的索引 0)并且它也无法显示我的任何项目select 在弹出窗口中。
绑定问题
文档建议使用绑定,并提供了一个使用核心数据在弹出窗口中加载关系数据的示例。尽管我的应用程序设置不同,但我仍然尝试使用数组控制器,但这不会填充 popUpButtoncell 中的数据。
我的数据结构是一个简单的class对象,没有核心数据,看起来像这样。
class Display: NSObject {
var name: String
var resolution: String
var availableResolutions: [String]
}
我想使用 availableResolutions 数组来填充下拉列表。
我的 table 中的每一行代表 Display 对象的一个实例。我希望 NSPopUpButtonCell 显示该特定显示器的 availableResolutions 列表中的项目。我不确定是否可以为每个显示行创建一个动态列表。
我试过的
我为我的 NSPopUpButtonCell 创建了一个 IBOutlet,我在 objectValueForTableColumn 和 setObjectValue 中引用它。我在 objectValueForTableColumn 中添加了 availableResultions 数组。
@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()
}
}
}
我错过了什么?
有绑定:
将列的 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
}
p.s。我不熟悉 Swift.
背景
我有一个包含 3 列的 NSTableView,其中一列有一个 NSPopUpButtonCell。
我一直未能成功使用数据绑定来填充单元格数据,因此我现在正在尝试一种新方法,通过使用 addItemsWithTitles 以编程方式设置值。
虽然这种方法可以加载值,但它无法显示默认的 selected(我可以使用数组的索引 0)并且它也无法显示我的任何项目select 在弹出窗口中。
绑定问题
文档建议使用绑定,并提供了一个使用核心数据在弹出窗口中加载关系数据的示例。尽管我的应用程序设置不同,但我仍然尝试使用数组控制器,但这不会填充 popUpButtoncell 中的数据。
我的数据结构是一个简单的class对象,没有核心数据,看起来像这样。
class Display: NSObject {
var name: String
var resolution: String
var availableResolutions: [String]
}
我想使用 availableResolutions 数组来填充下拉列表。
我的 table 中的每一行代表 Display 对象的一个实例。我希望 NSPopUpButtonCell 显示该特定显示器的 availableResolutions 列表中的项目。我不确定是否可以为每个显示行创建一个动态列表。
我试过的
我为我的 NSPopUpButtonCell 创建了一个 IBOutlet,我在 objectValueForTableColumn 和 setObjectValue 中引用它。我在 objectValueForTableColumn 中添加了 availableResultions 数组。
@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()
}
}
}
我错过了什么?
有绑定:
将列的 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
}
p.s。我不熟悉 Swift.