2016-04-01 2 views
0

背景ココアNSPopUpButtonCellは私が3列でNSTableViewを持って選択した値

を表示しない、そのうちの一つは、NSPopUpButtonCellを持っています。

データバインディングを使用してセルデータを埋め込むのに失敗しました。そのため、addItemsWithTitlesを使用してプログラムで値を設定することで新しいアプローチを試しています。

この方法では値をロードできませんでしたが、選択したデフォルト値を表示できませんでした(私の配列のインデックス0でも問題ありません)。また、ポップアップで選択した項目が表示されません。

バインディング問題

ドキュメンテーションは、バインディングを使用することをお勧めして、ポップアップでリレーショナル・データをロードするためにコアデータを使用した例を提供します。私のアプリは別に設定されていますが、私はまだアレイコントローラを使用しようとしましたが、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() 
     } 
    } 
} 

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

バインド列のSelected Valueresolution:バインディングで

+0

objectValueForTableColumnとsetObjectValueが呼​​び出されていますか?これらはセルベースのテーブルビューではありませんか?ほとんどの場合、ビューベースのテーブルビューがあります。 – user965972

+0

セルベースのコンテンツモードが設定されています。私はobjectValueForTableColumnが呼び出されたことを確認することができます。実際に他の列のデータが移入されます。また、setObjectValueが呼​​び出され、テーブル内のデータを変更すると機能します。 –

答えて

0

同じアレイコントローラへのカラムのContent ValuesarrangedObjects,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.私はスウィフトに慣れていない。

+0

これは正しい方向に私を指摘した。 objectValueForTableColumnにindexOfを返す必要がありました。まず、display.availableResolutions.indexOf(display.resolution)がnilであるかどうかを確認します。そうであれば、リストの最初の項目を返します。そうでない場合は、上記を返します。ありがとうございました! –

関連する問題