2017-07-06 22 views
0

Ich habe einige Daten eine JSON-Datei bilden, die ich in umgewandelt haben:Swift - Array Tableview in macOS

var tempArray = [NSDictionary]() 

Hier ist, was eine Probe dieser Daten wie folgt aussieht:

(
    { 
     active = y; 
     "campaign_id" = "Sample ID 1"; 
     description = "Sample Text"; 
     "end_date_time" = "2017-10-01 00:00:00"; 
     "on_expiry" = ignore; 
     "on_invalid_user" = reject; 
     "start_date_time" = "2017-07-01 00:00:00"; 
     "voucher_code" = SAMPLEON1; 
     "voucher_code_id" = "Sample ID 4"; 
    }, 
    { 
     active = y; 
     "campaign_id" = "Sample ID 2"; 
     description = "Sample Text"; 
     "end_date_time" = "2017-10-01 00:00:00"; 
     "on_expiry" = ignore; 
     "on_invalid_user" = reject; 
     "start_date_time" = "2017-06-02 00:00:00"; 
     "voucher_code" = SAMPLEOFF1; 
     "voucher_code_id" = "Sample ID 5"; 
    } 
) 

I haben eine NSTableView Ausgang eingerichtet, und es hat Spalten mit Kennungen relativ zum Wörterbuch oben:

@IBOutlet var voucherTableView: NSTableView! 

Sobald ich die 012.378 laufenCode in meiner Controller-Tabelle auffüllt mit der richtigen Menge an Zeilen, aber die Daten in den Spalten sind alle gleich:

After reloadData

Hier meine tableView func ist:

private func tableView(tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 



     let cellView = voucherTableView.make(withIdentifier: "cell", owner: self) as! NSTableCellView 

     cellView.textField!.stringValue = self.values.object(at: row) as! String 

     return cellView 
    } 

Hat jemand habe ich einen Einblick, wie man die Daten von meinem Array in die tableView des Reload-Befehls bringt?

Antwort

1

Ich empfehle Cocoa Bindungen

  • Connect datasource der Tabellenansicht im Interface Builder zu der Zielklasse
  • Implementieren Sie diese beiden Methoden (viewForColumn:row ist nicht erforderlich)

    func numberOfRows(in tableView: NSTableView) -> Int 
    { 
        return tempArray.count 
    } 
    
    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? 
    { 
        return tempArray[row] 
    } 
    
  • zu verwenden

    In Interface Builder Bindings Inspector binden Sie das value des Textfelds an Table Cell View > objectValue.[property] für Prüfung ple

    enter image description here

Hinweis: Es wird dringend die Wörterbücher zu einer benutzerdefinierten Klasse zur Karte empfohlen (eine class geerbt von NSObject obligatorisch ist)

+0

Ausgezeichnete Anweisung! Arbeitete wie ein Zauber, und ich werde in die Zuordnung des Wörterbuchs zu einer benutzerdefinierten Klasse schauen. Das ist alles lernen, wie ich wirklich gehe. Danke noch einmal. – webmasterjunkie

0

Wenn Sie die Spaltenbezeichner setzen die Schlüssel passen in Ihr Wörterbuch, Sie sollten in der Lage sein, dies zu tun:

private func tableView(tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    let cellView = voucherTableView.make(withIdentifier: "cell", owner: self) as! NSTableCellView 

    cellView.textField!.stringValue = tempArray[row][tableColumn.identifier] as! String 

    return cellView 
}