Recherche…


Introduction

Depuis que j'ai commencé à travailler avec Xamarin, il y a beaucoup de choses que j'aimerais que quelqu'un d'autre ait déjà documentées. Ici, j'explique comment utiliser 1 aspect de l'auto-complétion de Google Places, le contrôle de l'interface utilisateur utilisant un contrôleur de résultats. Bien que ce code soit basé sur des exemples de googles convertis en C # à partir de Swift, j'ai fait de mon mieux pour en faire un exemple pleinement fonctionnel. J'espère que cette documentation aidera beaucoup les autres.

Ajoutez un contrôle d'auto-complétion d'interface utilisateur avec le contrôleur de résultats.

Le contrôle d'auto-complétion de l'interface utilisateur est une boîte de dialogue de recherche avec une fonctionnalité de saisie automatique intégrée. Lorsqu'un utilisateur entre des termes de recherche, le contrôle présente une liste de lieux à choisir. Lorsque l'utilisateur effectue une sélection, une instance GMSPlace (Place in Xamarin) est renvoyée, que votre application peut ensuite utiliser pour obtenir des détails sur l'endroit sélectionné.

Comme mentionné ci-dessus, cet exemple utilise un contrôleur de résultats qui permet de mieux contrôler l'interface utilisateur de saisie de texte. Le contrôleur de résultats bascule dynamiquement la visibilité de la liste de résultats en fonction du focus de l'interface utilisateur en entrée.

Le but de ce code est d'afficher un écran comme ci-dessous:

entrer la description de l'image ici

Cela va automatiquement compléter votre adresse lorsque vous commencez à taper, comme l'image ci-dessous:

entrer la description de l'image ici

Instructions:

  1. Nous devons d'abord ajouter l'API Google Maps à notre Visual Studio. Elle est disponible via Nuget, recherchez simplement Xamarin.Google.iOS.Maps, ajoutez-la à votre projet iOS. Vous pouvez également la télécharger à partir de Xamarin Xamarin Google Maps iOS SDK.

  2. Nous avons besoin de quelque chose comme un bouton pour déclencher le contrôleur de vue autocomplete Google. Dans cet exemple, je le fais avec un story-board et j'ai ajouté un bouton nommé GoogleButton, vous pouvez le déclencher avec du code, cela n'a pas vraiment d'importance.

  3. Sous ViewDidLoad dans votre classe de contrôleurs de vue, ajoutez le code suivant. Dans mon exemple ci-dessous, je n'utilise pas l'emplacement réel des appareils mobiles, ma solution finale le ferait bien sûr, mais c'était un test et je ne voulais pas implémenter de code supplémentaire avant d'avoir prouvé que cela fonctionnait ou diluer ce que j'essayais pour vous montrer:

// Code pour faire apparaître le contrôleur de vue complète automatique de Google.

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. Ceci est facultatif, mais j'ai ajouté une fonction pour calculer les limites locales, je passe en 3000 ce nombre est en mètres, donc si vous voulez une plus grande limite initiale, n'hésitez pas à noter, s'il vous plaît dans le monde, il ne fait que pondérer les résultats initiaux à ces limites locales. Cette fonction a été empruntée à un message de dépassement de pile, je l'ai converti de Swift à C # pour nos besoins:
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. Cet extrait de code final est le délégué pour l'autocomplétion, nous avons besoin de ce délégué pour gérer tout ce que google va nous retourner:
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);
    }

}

Exécutez votre projet et il devrait fonctionner parfaitement, cet exemple est très ciblé, mais j'espère que cela vous donnera un exemple de base de la façon dont les contrôles de l'interface utilisateur de google autocomplete devraient fonctionner. Merci!



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow