2016-04-01 21 views
0

背景可可NSPopUpButtonCell不顯示所選擇的值

我有一個NSTableView 3列,它們中的一個具有一NSPopUpButtonCell。

我一直在使用數據綁定填充單元格數據不成功,因此我現在試圖通過使用addItemsWithTitles以編程方式設置值來嘗試新方法。

雖然這種方法已經加載了值,但它沒有顯示選中的默認值(我可以使用我的數組中的索引0)並且它也無法顯示我在彈出窗口中選擇的任何項目。

綁定問題

的單證建議使用綁定和提供使用核心數據在彈出加載關係數據的例子。儘管我的應用程序設置不同,但我仍然嘗試使用數組控制器,但這不會填充popUpButtoncell中的數據。

我的數據結構是一個簡單的類對象,沒有核心數據,它看起來像這樣。

class Display: NSObject { 
    var name: String 
    var resolution: String 
    var availableResolutions: [String] 
} 

我想使用availableResolutions數組填充下拉列表。

我的表中的每一行都代表Display對象的一個​​實例。我希望NSPopUpButtonCell在可用分辨率的特定顯示列表中顯示項目。我不確定是否有可能爲每個Display行設置一個動態列表。

我已經試過

我創建一個IBOutlet我NSPopUpButtonCell,我引用它在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() 
     } 
    } 
} 

我在想什麼?

+0

你確定調用了objectValueForTableColumn和setObjectValue嗎?這些不是基於單元的tableviews嗎?您最有可能擁有基於視圖的表格視圖。 – user965972

+0

內容模式設置爲基於單元格。我可以確認objectValueForTableColumn被調用,因爲其他列的數據實際上已被填充。此外,setObjectValue被調用,如果我修改表中的任何數據,則工作。 –

回答

0

隨着綁定:柱

綁定Selected ValuearrangedObjectsresolution

將列的結合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不熟悉。

+0

這指出我在正確的方向。我需要返回objectValueForTableColumn中的indexOf。首先我檢查display.availableResolutions.indexOf(display.resolution)是否爲零。如果是,那麼我會返回列表中的第一個項目,否則我會返回上面的內容。謝謝! –