2017-11-10 5 views
1

私はSwiftには新しく、NSOutlineViewでNSTreeControllerを実装する方法を学習しようとしています。私はそのような例を示すいくつかのガイドに従ってきましたが、私はエラーを受け取り続けます。私はステップバイステップを踏んだり、利用可能であればソースコードを実行しようとしましたが、同じエラーが発生しました。私は、Swift 4にいくつかの変更があり、これらのSwift 3の例がエラーを引き起こすと思うようになりました。 Swift 4には多くの例はありませんので、ここで質問してみてください。NSTreeControllerのエラー - このクラスはキーのキーコードに準拠していません

私は取得していますエラーは次のとおりです。

このクラスは、キー値コーディング準拠のキーのisLeafのためではありません。

NSTreeController用に設定されたキーパスからエラーが発生していると思います。

Tree Controller

しかし、私はエラーを修正するために何をすべきかわかりません。

私は年という単純なモデルクラスを持っています。

class Year: NSObject { 

    var name: String 

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

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

ビューコントローラは次のようになります。

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)! 
     } 
    } 
} 

私はプログラムを実行すると、それは問題を引き起こさないが、私はルートの2人の子供を表示するには、ノードを展開するとき、それは私が上記のエラーを与えています。

答えて

0

isLeafNSOutlineViewでKVOで使用されているので、あなたがisLeaf機能の前で@objcを追加する必要があります。

@objc func isLeaf() -> Bool { 
    return true 
} 
関連する問題