簡體   English   中英

NSTreeController 錯誤 - 此類不符合鍵的鍵值編碼

[英]Error with NSTreeController - this class is not key value coding-compliant for the key

我是 Swift 的新手,正在嘗試學習如何使用 NSOutlineView 實現 NSTreeController。 我一直在遵循幾個顯示此類示例的指南,但我不斷收到錯誤消息。 我一步一步跟隨和/或嘗試運行他們的源代碼(如果可用),但我遇到了同樣的錯誤。 我開始認為 Swift 4 中有一些變化,這使得這些 Swift 3 示例產生錯誤。 由於在 Swift 4 中完成的示例並不多,我決定通過在此處提出問題來嘗試一下。

我得到的錯誤是:

此類不符合鍵 isLeaf 的鍵值編碼。

我相信錯誤來自為 NSTreeController 設置的關鍵路徑:

在此處輸入圖片說明

但是我不確定需要做什么來修復錯誤。

我有一個名為 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)!
        }
    }
}

當我運行程序時,它不會引起任何問題,但是當我展開節點以顯示根的兩個子節點時,它給出了我上面提到的錯誤。

您綁定到的類需要符合 KVO。

所以,它需要是 NSObject 的子類。 並且 objc 運行時需要訪問。

一種方法:

@objcMembers
class FileSystemItem: NSObject {

或者,您可以使用 @objc 注釋每個字段/函數

完整示例

因為isLeaf在 KVO 中被NSOutlineView ,所以你必須在isLeaf函數前添加@objc

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM