0

我正在制作一个新的 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 通知。我怎样才能做到这一点? 收到错误

plist 编辑器充满活力

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

4

1 回答 1

2

在不提供更多信息的情况下,我猜您忘记声明您的课程符合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事件,您需要子类化NSSearchField和覆盖textDidChange函数。每次在 searchField 中发生更改时,它都会为您调用该函数。

class DLSearchField: NSSearchField {

    override func textDidChange(_ notification: Notification) {
        Swift.print("textDidChange")
    }
}
于 2017-05-10T11:58:08.773 回答