Sök…


Introduktion

Sedan jag började arbeta med Xamarin har det varit många saker jag önskar att någon annan redan hade dokumenterat. Här förklarar jag hur man använder en aspekt av google placerar autofyllt, UI-kontrollen använder en resultatkontroller. Medan denna kod är baserad på Googles egna exempel konverterade till C # från Swift har jag försökt mitt bästa för att se till att det är ett fullt fungerande exempel. Jag hoppas verkligen att denna dokumentation kommer att hjälpa andra.

Lägg till en autokomplett UI-kontroll med resultatkontrollen.

Kontrollen för autofullständig UI är en sökdialog med inbyggd autofullständig funktionalitet. När en användare anger söktermer presenterar kontrollen en lista med förutsagda platser att välja mellan. När användaren gör ett val, returneras en GMSPlace (plats i Xamarin) -instans, som din app sedan kan använda för att få information om den valda platsen.

Som nämnts ovan använder detta exempel en resultatkontroller som möjliggör mer kontroll över textinmatningsgränssnittet. Resultatstyrenheten växlar dynamiskt över resultatlistans synlighet baserat på ingångs UI-fokus.

Syftet med denna kod är att visa en skärm precis som nedan:

ange bildbeskrivning här

Detta kommer automatiskt att fylla i din adress när du börjar skriva, som bilden nedan:

ange bildbeskrivning här

Instruktioner:

  1. Först måste vi lägga till google maps API i vår Visual Studio. Det är tillgängligt via Nuget, bara söka efter Xamarin.Google.iOS.Maps, lägga till det i ditt iOS-projekt, alternativt kan du ladda ner det från Xamarin Xamarin Google Maps iOS SDK

  2. Vi behöver något som en knapp för att utlösa google autocomplete view controller. I det här exemplet gör jag detta med ett storyboard och har lagt till en knapp som heter GoogleButton, du kan trigga den med kod det spelar ingen roll.

  3. Lägg till följande kod under ViewDidLoad i klassen för visningskontroller. I mitt exempel nedan använder jag inte den faktiska platsen för mobila enheter, min slutliga lösning skulle naturligtvis göra detta, men detta var ett test och jag ville inte implementera extra kod förrän jag hade bevisat att det fungerade eller utspädde det jag försöker att visa dig:

// Kod för att få upp Googles placeringskontroll för automatisk komplett visning.

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. Detta är valfritt, men jag har lagt till en funktion för att beräkna lokala gränser, jag passerar 3000 detta antal är i meter, så om du vill ha en större initiala gränser känn dig fri att justera, observera att googlesökning fortfarande hittar någon adress i världen väger det bara de första resultaten till dessa lokala områden gränser först. Den här funktionen lånades från en stacköverskridningsstolpe, jag har konverterat den från Swift till C # för våra ändamål:
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. Det här slutliga kodavsnittet är delegaten för autofyllnaden, vi behöver den här delegaten för att hantera allt som Google kommer att returnera till oss:
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);
    }

}

Kör ditt projekt och det ska fungera perfekt, det här exemplet är ganska inriktat, men förhoppningsvis tills det ger dig ett grundläggande exempel på hur någon av Googles autokompletta UI-kontroller skulle behöva fungera. Tack!



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow