2017-11-10 13 views
1

저는 Swift를 처음 사용하고 NSOutlineView를 사용하여 NSTreeController를 구현하는 방법을 배우려고합니다. 나는 그러한 예를 보여주는 여러 가이드를 따라 왔지만 오류가 계속 발생합니다. 나는 한 걸음 한걸음 씩 따라 갔고 가능한 경우 소스 코드를 실행하려고했지만 같은 오류가 발생했습니다. 나는 스위프트 4에 약간의 변화가 있다고 생각해 왔는데, 이것이 스위프트 3의 예가 오류를 일으키는 원인이되었다. 스위프트 4에서는 많은 예제가 없으므로 여기에서 질문을함으로써 시도해 보겠다고 결심했습니다.NSTreeController에 대한 오류 -이 클래스는 키 코드 값과 호환되지 않습니다.

내가 갖는 오류 :

이 클래스는 키 isLeaf에 대한 코딩을 준수하는 키 값은 없습니다.

NSTreeController에 설정된 키 경로에서 오류가 발생한다고 생각합니다.

Tree Controller

그러나 나는 오류를 해결하기 위해 수행해야 할 무엇 확실하지 않다.

나는 Year라고하는 간단한 모델 클래스가 있습니다.

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

, 그것은 아무 문제가 발생하지 않습니다,하지만 난 루트의 두 아이를 보여 노드를 확장 할 때, 내가 위에서 언급 한 오류를주고있다. isLeafNSOutlineView으로 KVO에 사용되는

답변

0

때문에 isLeaf 기능의 앞에 @objc를 추가 할 수 있습니다

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