バックグラウンド
3 つの列を持つ NSTableView があり、そのうちの 1 つに NSPopUpButtonCell があります。
データバインディングを使用してセルデータを設定することに失敗したため、addItemsWithTitles を使用してプログラムで値を設定する新しいアプローチを試みています。
このアプローチは値をロードするために機能しましたが、デフォルトで選択されたものを表示できず (配列のインデックス 0 で問題ありません)、ポップアップで選択した項目も表示できません。
バインディングの問題
ドキュメントは、バインディングの使用を提案し、Core Data を使用してポップアップにリレーショナル データをロードする例を提供します。私のアプリは別の方法で設定されていますが、それでも配列コントローラーを使用しようとしましたが、popUpButtoncell にデータが取り込まれませんでした。
私のデータ構造は単純なクラス オブジェクトであり、コア データはなく、次のようになります。
class Display: NSObject {
var name: String
var resolution: String
var availableResolutions: [String]
}
availableResolutions 配列を使用してドロップダウンに入力したいと思います。
テーブルの各行は、Display オブジェクトのインスタンスを表します。NSPopUpButtonCell に、その特定の Display の 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()
}
}
}
私は何が欠けていますか?