Yosemite 中的 NSSearchField 委托

NSSearchField delegate in Yosemite

我正在制作一个新的 Swift (3.0) 框架,它涉及使用以编程方式创建的 NSSearchField,就像其他视图一样。 此框架将部署目标设置为 10.10,我发现无法为其设置委托方法很奇怪。事实上 NSSearchFieldDelegate 只出现在 10.11 上可用。

class PlistEditor: NSObject, NSOutlineViewDelegate, NSOutlineViewDataSource, NSTextFieldDelegate, NSSearchFieldDelegate {
 var searchField : NSSearchField?
 // more code..
 init(tabItem: NSTabViewItem,
       plistPath: String?) {
        // more code..
        let sf = NSSearchField(frame: NSMakeRect(80, 0, 80, 22))
        self.searchField? = sf
        // more code..
        super.init()
        // more code..
        if #available(OSX 10.11, *) {
            self.searchField?.delegate = self
        } else {
            // Fallback on earlier versions

        }

        // more code
    }

}

好的,我认为它是 NStextField 固有的,也许我可以访问单元格并使用超类委托进行设置,但不幸的是我找不到这样做的方法。 我需要的是能够在 10.10 中收到 NSText/NSTextField 通知。我怎样才能做到这一点?

已编辑: 添加了更多关于如何制作的信息以及一些图片

没有提供更多信息,我猜你忘了声明你的 class 符合 NSSearchFieldDelegate

参见下面的例子,如何设置它例如viewController。您只需为 vc 创建一个扩展,并声明它符合委托。

class SearchViewController: NSViewController {
    let searchField: NSSearchField? = NSSearchField(frame: .zero)

    override func viewWillAppear() {
        super.viewWillAppear()
        if #available(OSX 10.11, *) {
            self.searchField?.delegate = self
        } else {
            // Fallback on earlier versions

        }
    }
}

extension SearchViewController: NSSearchFieldDelegate {
    func searchFieldDidStartSearching(_ sender: NSSearchField) {
        print("didStart")
    }

    func searchFieldDidEndSearching(_ sender: NSSearchField) {
        print("didEnd")
    }
}

编辑:
要捕获 Mac OS 早期版本中的 textDidChange 事件,您需要 subclass NSSearchField 并覆盖 textDidChange 函数。每当 searchField 发生变化时,它都会为您调用该函数。

class DLSearchField: NSSearchField {

    override func textDidChange(_ notification: Notification) {
        Swift.print("textDidChange")
    }
}