2016-04-01 16 views
0

BackgroundKakao NSPopUpButtonCell I 3 bölümlerinden biri bir NSPopUpButtonCell sahip olan bir NSTableView sahip seçilen değer

göstermez.

Hücre verilerini doldurmak için veri bağlamaları kullanmakta başarısız oldum, çünkü artık değerleri addItemsWithTitles ile programatik olarak ayarlayarak yeni bir yaklaşım deniyorum.

Bu yaklaşım değerleri yüklemek için çalıştıysa da, varsayılanı (dizilimin dizin 0'ı ile tamamlıyorum) seçili olarak göstermemekte ve aynı zamanda, açılır pencerede seçtiğim herhangi bir öğeyi görüntülemede başarısız olmaktadır.

Bağlantıları Sayı

dokümantasyon bağları kullanarak önermek ve açılır ilişkisel veri yüklemek için çekirdek veri kullanılarak bir örnek oluşturmaktadır. Uygulamam farklı şekilde ayarlanmış olsa da, yine de bir Array Denetleyicisini kullanmaya çalıştım ancak bu, popUpButtoncell'deki verileri doldurmayacaktı.

Veri yapığım basit bir sınıf nesnesi, çekirdek verisi yok ve buna benziyor.

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

Açılır alanı doldurmak için availableResolutions dizisini kullanmak isterim.

Tablomdaki her satır, Görüntüleme nesnesinin bir örneğini temsil eder. NSPopUpButtonCell öğesinin, söz konusu Görüntülü Reklamların mevcutResolutions listesindeki öğeleri görüntülemesini istiyorum. Her bir Görüntülü Reklam Ağı için dinamik bir listeye sahip olmanın mümkün olup olmadığından emin değilim. Ben

denedim ne

benim NSPopUpButtonCell için bir IBOutlet oluşturulan ve ben objectValueForTableColumn ve setObjectValue bunu başvuran ediyorum. ObjectValueForTableColumn öğesinin içindeki mevcutResultions dizisini ekliyorum.

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

Neyi eksik?

+0

objectValueForTableColumn ve setObjectValue öğesinin çağrıldığından emin misiniz? Bunlar hücre bazlı tablo görüntülemeleri için değil mi? Büyük olasılıkla görünüm tabanlı bir tablo görünümüne sahip olursunuz. – user965972

+0

İçerik Modu Hücre Temeli için ayarlanmıştır. Diğer sütunlar için veri aslında doldurulur olarak objectValueForTableColumn çağrılır onaylayabilirsiniz.Ayrıca, setObjectValue çağrılır ve tablodaki herhangi bir veriyi değiştirirseniz çalışır. –

cevap

0

ile ciltleri: arrangedObjects kolonun

bağlama Selected Value, resolution. Aynı dizi denetleyicisine (arrangedObjects, availableResolutions) sütunun Content Values numaralı bağlantı noktasını

.

olmadan bağlamaları:

veri kaynağı yöntemleri tableView:objectValueForTableColumn:row: ve seçilen öğe ile tableView:setObjectValue:forTableColumn:row: anlaşma. Delege yöntemi tableView:dataCellForTableColumn:row:, öğelerle ilgilenir.

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'e aşina değilim.

+0

Bu bana doğru yönde işaret etti. ObjectOalueForTableColumn öğesinde indexOf değerini döndürmem gerekiyordu. Önce ben display.availableResolutions.indexOf (display.resolution) öğesinin sıfır olup olmadığını kontrol ediyorum. Eğer öyleyse, listedeki ilk öğeyi döndürürsem, aksi halde geri veririm. Teşekkür ederim! –

İlgili konular