Suche…


Einführung

Seit ich angefangen habe, mit Xamarin zu arbeiten, gab es viele Dinge, von denen ich wünschte, jemand anderes hätte dies bereits dokumentiert. Hier erkläre ich, wie man einen Aspekt der automatischen Vervollständigung von Google Places verwendet, wobei das UI-Steuerelement einen Ergebniscontroller verwendet. Obwohl dieser Code auf Googles eigenen Beispielen basiert, die von Swift in C # konvertiert wurden, habe ich mein Bestes gegeben, um sicherzustellen, dass es ein voll funktionsfähiges Beispiel ist. Ich hoffe sehr, dass diese Dokumentation anderen helfen wird.

Fügen Sie eine Autocomplete-UI-Steuerung mit Ergebnissteuerung hinzu.

Das Autocomplete-UI-Steuerelement ist ein Suchdialog mit integrierter Autocomplete-Funktion. Wenn ein Benutzer Suchbegriffe eingibt, zeigt das Steuerelement eine Liste der vorhergesagten Orte zur Auswahl an. Wenn der Benutzer eine Auswahl trifft, wird eine GMSPlace-Instanz (In Xamarin platzieren) zurückgegeben, die Ihre App verwenden kann, um Details zum ausgewählten Ort abzurufen.

Wie oben erwähnt, verwendet dieses Beispiel einen Ergebniscontroller, der eine bessere Kontrolle über die Texteingabe-Benutzeroberfläche ermöglicht. Der Ergebniscontroller schaltet die Sichtbarkeit der Ergebnisliste basierend auf dem Fokus der Eingabe-Benutzeroberfläche dynamisch um.

Ziel dieses Codes ist es, einen Bildschirm wie folgt anzuzeigen:

Geben Sie hier die Bildbeschreibung ein

Dies wird Ihre Adresse automatisch vervollständigen, wenn Sie mit der Eingabe beginnen, wie im Bild unten:

Geben Sie hier die Bildbeschreibung ein

Anleitung:

  1. Zuerst müssen Sie die Google Maps-API zu unserem Visual Studio hinzufügen. Sie ist über Nuget verfügbar. Suchen Sie einfach nach Xamarin.Google.iOS.Maps, fügen Sie sie Ihrem iOS-Projekt hinzu. Alternativ können Sie sie auch von Xamarin herunterladen. Google Maps iOS SDK für Google Maps

  2. Wir brauchen so etwas wie eine Schaltfläche, um den Google Autocomplete View Controller auszulösen. In diesem Beispiel mache ich dies mit einem Storyboard und habe eine Schaltfläche mit dem Namen GoogleButton hinzugefügt. Sie könnten sie mit Code auslösen, es spielt keine Rolle.

  3. Fügen Sie unter ViewDidLoad in Ihrer View-Controller-Klasse den folgenden Code hinzu. In meinem Beispiel verwende ich nicht den tatsächlichen Standort der mobilen Geräte, meine endgültige Lösung würde dies natürlich tun, aber dies war ein Test, und ich wollte keinen zusätzlichen Code implementieren, bis ich bewiesen habe, dass dies funktioniert oder verwässert wurde, was ich versuche um dir zu zeigen:

// Code, um den Controller für die automatische vollständige Ansicht von Google Places aufzurufen.

GoogleButton.TouchUpInside += (sender, ea) =>
{

    var FakeCoordinates = new CLLocationCoordinate2D()
    {
        Latitude = 54.135364,
        Longitude = -0.797888
    };

    var north = LocationWithBearing(45, 3000, FakeCoordinates);
    var east = LocationWithBearing(225, 3000, FakeCoordinates);

    var autocompleteController = new AutocompleteViewController();
    autocompleteController.Delegate = new AutoCompleteDelegate();
    autocompleteController.AutocompleteBounds = new CoordinateBounds(north, east);
    PresentViewController(autocompleteController, true, null);
                
};
  1. Dies ist optional, aber ich habe eine Funktion hinzugefügt, um die lokalen Grenzen zu berechnen. Ich überschreite 3000. Diese Zahl wird in Metern angegeben. Wenn Sie also größere Anfangsgrenzen wünschen, passen Sie diese bitte an. Beachten Sie bitte, dass bei der Google-Suche nach Adressen gesucht wird in der Welt gewichtet es die ersten Ergebnisse nur an diese Grenzen. Diese Funktion wurde aus einem Stack-Überlaufpfosten entlehnt. Ich habe sie für unsere Zwecke von Swift nach C # konvertiert:
public CLLocationCoordinate2D LocationWithBearing(Double bearing, Double distanceMeters, CLLocationCoordinate2D origin)
{
    var distRadians = distanceMeters/(6372797.6);

    var rbearing = bearing*Math.PI/180.0;

    var lat1 = origin.Latitude*Math.PI/180;
    var lon1 = origin.Longitude*Math.PI/180;

    var lat2 = Math.Asin(Math.Sin(lat1)*Math.Cos(distRadians) + Math.Cos(lat1)*Math.Sin(distRadians)*Math.Cos(rbearing));
    var lon2 = lon1 + Math.Atan2(Math.Sin(rbearing)*Math.Sin(distRadians)*Math.Cos(lat1),
                    Math.Cos(distRadians) - Math.Sin(lat1)*Math.Sin(lat2));

    return new CLLocationCoordinate2D(latitude: lat2*180/ Math.PI, longitude: lon2*180/Math.PI);
}
  1. Dieses letzte Code-Snippet ist der Delegierte für die automatische Vervollständigung. Wir benötigen diesen Delegierten, um alle Google-Aktionen abzuwickeln:
public  class AutoCompleteDelegate : AutocompleteViewControllerDelegate
{

    public override void DidFailAutocomplete(AutocompleteViewController viewController, NSError error)
    {
        // TODO: handle the error.
        Debug.Print("Error: " + error.Description);
    }


    public override void DidAutocomplete(AutocompleteViewController viewController, Place place)
    {
        Debug.Print(place.Name);
        Debug.Print(place.FormattedAddress);

        viewController.DismissViewController(true, null);
    }

    public override void DidRequestAutocompletePredictions(AutocompleteViewController viewController)
    {
        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
    }
        
    public override void DidUpdateAutocompletePredictions(AutocompleteViewController viewController)
    {
        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
    }
        
    public override void WasCancelled(AutocompleteViewController viewController)
    {
        viewController.DismissViewController(true, null);
    }

}

Führen Sie Ihr Projekt aus und es sollte einwandfrei funktionieren. Dieses Beispiel ist ziemlich fokussiert, aber hoffentlich wird Ihnen ein grundlegendes Beispiel dafür gegeben, wie alle Steuerelemente der Google Autocomplete-Benutzeroberfläche funktionieren müssen. Vielen Dank!



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow