2017-09-06 2 views
0

ich mit schnellen 4 für osx arbeiten, und ich möchte eine Adresse Funktion zur automatischen Vervollständigung wie Apfel Karten realisieren tut:Funktion zur automatischen Vervollständigung von Adressen und Anregung als Drop-Down-

enter image description here

Wie kann ich so etwas wie das tun Bild zeigt? Ich denke, die Struktur wird:

  • ein einfaches NSTextField
  • aber was ist das Popup-Menü? ist es ein einfaches Popover?

UPDATE Jetzt funktioniert meine app wie folgt aus:

enter image description here

brilliant Das ist. Aber ein kleines Problem:

Ich schreibe mein erstes Zeichen in das Textfeld, das Popover wird angezeigt und das Textfeld verliert den Fokus. Jetzt muss ich erneut in mein Textfeld klicken, um weiterzugehen. Gibt es eine Möglichkeit, den Fokus dieses Textfelds zu behalten?

+0

Es ist ein TableView in einem ScrollView in einem Popover. – Moritz

+0

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

+0

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

Antwort

0

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 

     } 

    } 
+1

Ich versuche es später zu aktualisieren - ich bin im Moment nicht zu Hause – Ghost108

Verwandte Themen