2017-09-06 4 views
0

Je travaille avec rapide 4 pour Mac OS X et je voudrais réaliser une fonction de saisie semi-automatique d'adresse comme des cartes de pomme fait:fonction de saisie semi-automatique des adresses et suggestion déroulant

enter image description here

Comment puis-je faire quelque chose comme l'image montre? Je suppose que la structure sera:

  • simple NSTextField
  • mais ce qui est le menu contextuel? est-ce un simple popover?

MISE À JOUR Maintenant mon application fonctionne comme ceci:

enter image description here

Thats brillant. Mais un petit problème:

J'écris mon premier caractère dans le champ de texte, le popover sera affiché et le champ de texte perdra le focus. Maintenant, je dois cliquer à nouveau dans mon champ de texte pour continuer. Y a-t-il un moyen de garder le focus de ce champ de texte?

+0

C'est un TableView dans un ScrollView dans un popover. – Moritz

+0

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

+0

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

Répondre

0

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 

     } 

    } 
+1

J'essaie de le mettre à jour plus tard - Je ne suis pas chez moi en ce moment – Ghost108