Zoeken…


Invoering

Sinds ik met Xamarin ben gaan werken, zijn er veel dingen die ik wou dat iemand anders al had gedocumenteerd. Hier leg ik uit hoe u 1 aspect van de automatische aanvulling van Google Places gebruikt, waarbij de UI-besturing gebruik maakt van een resultatencontroller. Hoewel deze code is gebaseerd op eigen voorbeelden van Google die zijn geconverteerd naar C # van Swift, heb ik mijn best gedaan om ervoor te zorgen dat het een volledig werkend voorbeeld is. Ik hoop heel erg dat deze documentatie anderen zal helpen.

Voeg een autocomplete UI-besturing met resultatencontroller toe.

Het UI-besturingselement voor automatisch aanvullen is een zoekdialoog met ingebouwde functionaliteit voor automatisch aanvullen. Wanneer een gebruiker zoektermen invoert, presenteert het besturingselement een lijst met voorspelde plaatsen om uit te kiezen. Wanneer de gebruiker een selectie maakt, wordt een GMSPlace-instantie (plaats in Xamarin) geretourneerd, die uw app vervolgens kan gebruiken om details over de geselecteerde plaats te krijgen.

Zoals hierboven vermeld, gebruikt dit voorbeeld een resultaatcontroller die meer controle over de tekstinvoer-UI mogelijk maakt. De resultatencontroller schakelt dynamisch de zichtbaarheid van de resultatenlijst in op basis van de invoer UI-focus.

Het doel van deze code is om een scherm weer te geven zoals hieronder:

voer hier de afbeeldingsbeschrijving in

Hiermee wordt je adres automatisch aangevuld wanneer je begint met typen, zoals de onderstaande afbeelding:

voer hier de afbeeldingsbeschrijving in

instructies:

  1. Eerst moeten we de Google maps API toevoegen aan onze Visual Studio, deze is beschikbaar via Nuget, zoek gewoon naar Xamarin.Google.iOS.Maps, voeg deze toe aan uw iOS-project, of u kunt hem downloaden van Xamarin Xamarin Google Maps iOS SDK

  2. We hebben zoiets als een knop nodig om de Google Autocomplete View Controller te activeren. In dit voorbeeld doe ik dit met een storyboard en heb ik een knop toegevoegd met de naam GoogleButton, je zou het kunnen activeren met code die er niet echt toe doet.

  3. Voeg onder ViewDidLoad in uw klasse viewcontrollers de volgende code toe. In mijn voorbeeld hieronder gebruik ik de werkelijke locatie van de mobiele apparaten niet, mijn uiteindelijke oplossing zou dit natuurlijk doen, maar dit was een test en ik wilde geen extra code implementeren totdat ik had bewezen dat dit werkte of verdunde wat ik probeer om u te laten zien:

// Code om de weergavecontroller van Google Places Auto Complete te openen.

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. Dit is optioneel, maar ik heb een functie toegevoegd om de lokale grenzen te berekenen, ik passeer in 3000 dit aantal is in meters, dus als je een grotere initiële limiet wilt, voel je vrij om aan te passen, houd er rekening mee dat Google Zoeken nog steeds elk adres kan vinden in de wereld, weegt het alleen de eerste resultaten naar deze lokale grenzen. Deze functie is ontleend aan een stapeloverlooppost, ik heb deze voor onze doeleinden van Swift naar C # geconverteerd:
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. Dit laatste codefragment is de afgevaardigde voor het automatisch aanvullen, we hebben deze afgevaardigde nodig om alles af te handelen dat Google naar ons zal terugkeren:
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);
    }

}

Voer uw project uit en het zou perfect moeten werken, dit voorbeeld is behoorlijk gericht, maar hopelijk geeft het u een eenvoudig voorbeeld van hoe een van de automatisch aanvullen UI-besturingselementen van Google zou moeten werken. Bedankt!



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow