i lösen sich die Situation wie folgt aus:
die controlTextDidChange
verwenden und präsentieren eine popover
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)
}
die popover hat eine Tableview, die die Vorschläge mit dem SearchCompleter (MapKit) bekommt
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
}
}
Es ist ein TableView in einem ScrollView in einem Popover. – Moritz
okay, also könnte mein Weg dies zu tun sein: textfield delegate text hat sich geändert> öffne Popover mit der Suchzeichenfolge und lass sie die Vorschläge machen, nicht wahr? – Ghost108
Delegierte Text hat sich geändert> Array mit Sätzen füllen, Tabellenansicht im Popover erstellen und anzeigen, keyDown und tableView Delegat überwachen, um zu wissen, welche Zeile ausgewählt ist, dann Textfeldinhalt durch Tabellenansichtsauswahl ersetzen (Achtung, die Tabelle wird nicht erneut ausgelöst)) und schließe das Popover. Das ist eine Menge Arbeit, aber es ist es wert, ich habe es in einer aktuellen App getan, Nutzer mögen diese Art von Interaktion. – Moritz