我解決像這樣的情況:
使用controlTextDidChange
並呈現酥料餅
override func controlTextDidChange(_ obj: Notification) {
vcAddress.searchString = txtSourceAddress.stringValue
self.presentViewController(vcAddress, asPopoverRelativeTo: txtSourceAddress.bounds, of: txtSourceAddress, preferredEdge: .maxX, behavior: .semitransient)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AutoComplete"), object: nil)
}
的酥料餅具有的tableview,它獲取與SearchCompleter(MapKit)的建議
import Cocoa
import MapKit
class AcAddress: NSViewController, NSTableViewDelegate, NSTableViewDataSource, MKLocalSearchCompleterDelegate {
var searchString:String?
var searchCompleter = MKLocalSearchCompleter()
var searchResults = [MKLocalSearchCompletion]()
@IBOutlet weak var tblAutoComplete: NSTableView!
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(AutoComplete), name: NSNotification.Name(rawValue: "AutoComplete"), object: nil)
searchCompleter.delegate = self
tblAutoComplete.refusesFirstResponder = true
}
@objc func notificationAutoComplete() {
searchCompleter.queryFragment = searchString ?? ""
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
searchResults = completer.results
tblAutoComplete.reloadData()
}
func numberOfRows(in tableView: NSTableView) -> Int {
return searchResults.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
// FILL IT
}
}
這是一個彈出窗口中的ScrollView的TableView。 – Moritz
沒問題,所以我這樣做的方式可能是:textfield委託文本確實改變>打開搜索字符串的popover並讓他們提出建議,不是嗎? – Ghost108
委託文本確實改變了>用命題填充數組,在彈出窗口中創建並顯示錶視圖,監視keyDown和tableView委託以知道哪一行被選中,然後用tableview選擇替換文本內容(注意不要在觸發表時再次觸發表)並關閉popover。這是很多工作,但它是值得的,我已經在最近的應用程序中完成了它,用戶喜歡這種交互。 – Moritz