i résoudre la situation comme ceci:
utiliser le controlTextDidChange
et présenter un 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)
}
le popover a un tableview, qui obtient les suggestions du 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
}
}
C'est un TableView dans un ScrollView dans un popover. – Moritz
ok, donc ma façon de le faire pourrait être: textfield délégué texte a changé> popover ouvert avec la chaîne de recherche et laissez-les faire les suggestions, n'est ce pas? – Ghost108
Le texte délégué a changé> populate array avec propositions, créer et afficher la table dans popover, monitor keyDown et tableView delegate pour savoir quelle ligne est sélectionnée, puis remplacez votre contenu textfield par la sélection tableview (attention à ne pas déclencher de nouveau la table) et fermez le popover. C'est beaucoup de travail, mais ça vaut le coup, je l'ai fait dans une application récente, les utilisateurs aiment ce genre d'interaction. – Moritz