Szukaj…


Wprowadzenie

Od momentu rozpoczęcia pracy z Xamarinem wiele rzeczy chciałbym, żeby ktoś inny już udokumentował. Tutaj wyjaśniam, jak korzystać z 1 aspektu autouzupełniania miejsc google, kontrola interfejsu użytkownika korzysta z kontrolera wyników. Chociaż ten kod jest oparty na własnych przykładach Google przekonwertowanych do C # z Swift, starałem się, aby był to w pełni działający przykład. Mam nadzieję, że ta dokumentacja pomoże innym.

Dodaj kontrolkę interfejsu użytkownika autouzupełniania z kontrolerem wyników.

Kontrolka interfejsu autouzupełniania to okno dialogowe wyszukiwania z wbudowaną funkcją autouzupełniania. Gdy użytkownik wprowadza wyszukiwane hasła, formant przedstawia listę przewidywanych miejsc do wyboru. Gdy użytkownik dokona wyboru, zwracana jest instancja GMSPlace (Place in Xamarin), której aplikacja może następnie użyć, aby uzyskać szczegółowe informacje na temat wybranego miejsca.

Jak wspomniano powyżej, w tym przykładzie użyto kontrolera wyników, który pozwala na większą kontrolę nad interfejsem wprowadzania tekstu. Kontroler wyników dynamicznie przełącza widoczność listy wyników w oparciu o fokus interfejsu użytkownika.

Celem tego kodu jest wyświetlenie ekranu takiego jak poniżej:

wprowadź opis zdjęcia tutaj

Spowoduje to automatyczne uzupełnienie adresu po rozpoczęciu pisania, jak na poniższym obrazku:

wprowadź opis zdjęcia tutaj

Instrukcje:

  1. Najpierw musimy dodać interfejs API Google Maps do naszego programu Visual Studio, jest on dostępny przez Nuget, po prostu wyszukaj Xamarin.Google.iOS.Maps, dodaj go do swojego projektu na iOS, lub możesz pobrać go z Xamarin Xamarin Google Maps iOS SDK

  2. Potrzebujemy czegoś w rodzaju przycisku, aby uruchomić kontroler widoku autouzupełniania google. W tym przykładzie robię to za pomocą planszy i dodałem przycisk o nazwie GoogleButton, możesz uruchomić go za pomocą kodu, który tak naprawdę nie ma znaczenia.

  3. W obszarze ViewDidLoad w swojej klasie kontrolerów widoku dodaj następujący kod. W poniższym przykładzie nie używam rzeczywistej lokalizacji urządzeń mobilnych, moje ostateczne rozwiązanie oczywiście by to zrobiło, ale to był test i nie chciałem implementować dodatkowego kodu, dopóki nie udowodnię, że działa lub rozrzedzam to, co próbuję pokazać Ci:

// Kod wywołujący kontroler widoku autouzupełniania miejsc 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. Jest to opcjonalne, ale dodałem funkcję do obliczania lokalnych granic, mijam w 3000 ta liczba jest w metrach, więc jeśli chcesz, aby większe początkowe granice można było dostosować, pamiętaj, że wyszukiwarka Google nadal znajdzie dowolny adres na świecie, najpierw ważą tylko początkowe wyniki do granic lokalnych. Ta funkcja została zapożyczona ze stosu przepełnienia stosu, dla naszych celów przekonwertowałem ją z Swift na C #:
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. Ten ostatni fragment kodu jest delegatem do autouzupełniania, potrzebujemy tego delegata, aby obsłużyć wszystko, co Google nam zwróci:
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);
    }

}

Uruchom swój projekt i powinien on działać idealnie, ten przykład jest dość skoncentrowany, ale mam nadzieję, że da ci podstawowy przykład tego, jak powinna wyglądać dowolna kontrola interfejsu użytkownika autouzupełniania google. Dzięki!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow