2016-03-25 13 views
2

Mein AppDelegate enthält ein Wörterbuch. Ich habe eine NSDictionaryController gebunden an dict. Ich habe dann binden Sie die 2 Spalten eines NSTableView zum Wörterbuch Controller:Erstellen Sie eine Tabelle mit allen Schlüsseln und Werten aus einem Wörterbuch.

  • Spalte 1 (Key): Controller Key = arrangedObjects. Modellschlüsselpfad = key
  • Spalte 2 (Wert): Steuerungsschlüssel = arrangedObjects. Modellschlüsselpfad = value

Aber meine Tabelle ist leer. Irgendeine Idee, wie das zu korrigieren ist?

Mein Code:

class AppDelegate { 
    dynamic var dict = NSMutableDictionary() 

    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     dict.setValue(1, forKey: "One") 
     dict.setValue(2, forKey: "Two") 
    } 
} 

ich auch versucht:

let newObject = dictController.newObject() 
newObject.setKey("One") // deprecated 
newObject.setValue(1) // deprecated 
dictController.addObject(newObject) 

Aber Xcode sagte setKey und setValue in 10.10.3 sind veraltet. Wie füge ich ein Objekt zu einem NSDictionaryController hinzu? Ich verwende Mac OS X 10.11.4.

+0

View-basierte und zellenbasierte Tabellenansichten verwenden unterschiedliche Bindungen. Basiert die Tabellenansicht? Welche Bindungen verwendest du? – Willeke

+0

Ich habe zellenbasierte Tabellenansicht verwendet – Jenny

+0

Wie haben Sie die Tabellenansicht an den Arraycontroller gebunden? – Willeke

Antwort

-1

Das kleine Geheimnis von NSDictionaryController ist, dass Sie müssen eine Liste der enthaltenen Schlüssel über die includedKeys Eigenschaft angeben. Sonst hat es nichts in arrangedObjects. Der einfachste Weg ist, die includedKeys an Ihre dict.keys Eigenschaft zu binden.

In Interface Builder:

  1. die Dictionary-Controller auswählen, gehen Sie auf die Bindung Inspector
  2. Für die inklusive Keys Eigenschaft: set Bind To = Delegate, Modell Key Path = dict.keys

Programmatically:

dictController.bind(NSIncludedKeysBinding, toObject: self, withKeyPath: "dict.keys", options: nil) 
+0

"dict.keys" sollte "dict.allKeys" sein? – Willeke

+0

'includedKeys' ist ein Array mit den Schlüsseln, die immer vorhanden sind, auch wenn sie nicht im Wörterbuch vorhanden sind. Das Binden dieser Eigenschaft zur richtigen Zeit könnte ein Workaround sein. Wird das Wörterbuch erneut der Eigenschaft zugewiesen, wird das Problem ebenfalls behoben. – Willeke

+0

Sie haben so eine interessante Möglichkeit, Wertschätzung zu zeigen! Ich benutzte Swifts ursprüngliches 'Dictionary' anstelle von' NSMutableDictionary' –

0

Der Wörterbuch-Controller sieht die Änderungen nicht innerhalb dict. Sie können dies lösen, indem Sie zuerst das Wörterbuch konstruieren und dann dict zuweisen.

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    var tempDict = NSMutableDictionary() 
    tempDict.setValue(1, forKey: "One") 
    tempDict.setValue(2, forKey: "Two") 
    dict = tempDict 
} 

Eine andere Lösung ist die Implementierung der Schlüssel/Wert-Beobachter-Compliance.

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    willChangeValueForKey("dict") 
    dict.setValue(1, forKey: "One") 
    dict.setValue(2, forKey: "Two") 
    didChangeValueForKey("dict") 
} 

Dank @Code Different für die Erkenntnis, was das Problem ist.