2017-11-10 6 views
1

Ich bin neu bei Swift und versuche zu lernen, wie man NSTreeController mit NSOutlineView implementiert. Ich habe mehrere Anleitungen verfolgt, die solche Beispiele zeigen, aber ich bekomme immer einen Fehler. Ich folgte Schritt für Schritt und/oder versuchte, ihre Quellcodes zu verwenden, falls verfügbar, aber ich bekam denselben Fehler. Ich bin der Meinung, dass es in Swift 4 einige Änderungen gibt, die diese Swift 3-Beispiele zu Fehlern führen. Da es in Swift 4 nicht viele Beispiele gibt, entschied ich, dass ich es versuchen würde, indem ich die Frage hier stelle.Fehler mit NSTreeController - diese Klasse ist nicht Schlüsselcodierung-kompatibel für den Schlüssel

Der Fehler Ich erhalte ist:

diese Klasse ist nicht Schlüssel-Wert-Codierung-konform für den Schlüssel isLeaf.

Ich glaube, dass Fehler von dem Schlüsselpfad kommt, der für NSTreeController eingerichtet wird.

Tree Controller

Allerdings bin ich nicht sicher, was getan werden muss, um den Fehler zu beheben.

Ich habe eine einfache Modellklasse namens Jahr.

class Year: NSObject { 

    var name: String 

    init(name: String) { 
     self.name = name 
    } 

    func isLeaf() -> Bool { 
     return true 
    } 
} 

Meine Ansicht Controller sieht so aus.

class ViewController: NSViewController, NSOutlineViewDataSource, NSOutlineViewDelegate { 

    @IBOutlet weak var outlineView: NSOutlineView! 
    @IBOutlet var treeController: NSTreeController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     addData() 
     outlineView.delegate = self 
     outlineView.dataSource = self 
     } 

    func addData() { 
     let root = ["name": "Year", "isLeaf": false] as [String : Any] 

     let dict: NSMutableDictionary = NSMutableDictionary(dictionary: root) 
     dict.setObject([Year(name: "1999"), Year(name: "2000")], forKey: "children" as NSCopying) 
     treeController.addObject(dict) 
    } 

    func isHeader(item: Any) -> Bool { 
     if let item = item as? NSTreeNode { 
      return !(item.representedObject is Year) 
     } else { 
      return !(item is Year) 
     } 
    } 

    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? { 
     if isHeader(item: item) { 
      return outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "HeaderCell"), owner: self)! 
     } else { 
      return outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "DataCell"), owner: self)! 
     } 
    } 
} 

Wenn ich das Programm ausführen, verursacht es kein Problem, aber wenn ich den Knoten erweitern, um die beiden Kinder der Wurzel zu zeigen, es gibt den Fehler, den ich oben erwähnt.

Antwort

0

Da ist isLeaf von NSOutlineView in KVO verwendet wird, haben Sie @objc vor isLeaf Funktion hinzuzufügen:

@objc func isLeaf() -> Bool { 
    return true 
} 
Verwandte Themen