0

バックグラウンド

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()
        }
    }
}

私は何が欠けていますか?

4

1 に答える 1

0

バインディングあり:

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
}

ps私はSwiftに慣れていません。

于 2016-04-01T22:31:55.653 に答える