Es kann losgehen!

Bevor Sie mit der Entwicklung beginnen, lesen Sie bitte unsere Entwicklerdokumentation.

Die Google Places API for iOS aktivieren

Zum Einstieg führen wir Sie durch die Google Developers Console, wo Sie vorab Folgendes tun müssen:

  1. Ein Projekt erstellen oder auswählen
  2. Die Google Places API for iOS aktivieren
  3. Zugehörige Schlüssel erstellen
Weiter

Orte automatisch vervollständigen

Der Dienst zur automatischen Vervollständigung der Google Places API for iOS macht als Antwort auf Suchabfragen von Nutzern Vorschläge zu möglichen Orten. Während Nutzer Eingaben machen, gibt der Dienst zur automatischen Vervollständigung Vorschläge für Orte zurück (etwa für Unternehmen, Adressen und Points of Interest).

Sie haben die folgenden Möglichkeiten, Ihrer App eine Funktion zur automatischen Vervollständigung hinzuzufügen:

UI-Steuerelement zur automatischen Vervollständigung hinzufügen

Das UI-Steuerelement zur automatischen Vervollständigung ist ein kleines Suchfenster mit integrierter Autocomplete-Funktion. Wenn ein Nutzer Suchbegriffe eingibt, stellt das Steuerelement eine Liste mit Ortsvorschlägen zur Auswahl. Wenn der Nutzer eine Auswahl vornimmt, wird eine GMSPlace-Instanz zurückgegeben, anhand derer Ihre App Details zum ausgewählten Ort abrufen kann.

Sie haben die folgenden Möglichkeiten, Ihrer App das UI-Steuerelement zur automatischen Vervollständigung hinzuzufügen:

Vollbildsteuerelement hinzufügen

Verwenden Sie das Vollbildsteuerelement, wenn Sie einen modalen Kontext benötigen, in dem die UI zur automatischen Vervollständigung vorübergehend die UI Ihrer App ersetzt, bis der Nutzer seine Entscheidung getroffen hat. Diese Funktionalität wird durch die Klasse GMSAutocompleteViewController bereitgestellt. Sobald der Nutzer einen Ort auswählt, erhält Ihre App einen Callback.

Um Ihrer App ein Vollbildsteuerelement hinzuzufügen, gehen Sie wie folgt vor:

  1. Erstellen Sie in Ihrer Haupt-App ein UI-Element, mit dem das Steuerelement für die Autocomplete-UI gestartet wird, zum Beispiel einen Berührungshandler auf einem UIButton.
  2. Implementieren Sie das Protokoll GMSAutocompleteViewControllerDelegate im übergeordneten Ansichtscontroller.
  3. Erstellen Sie eine Instanz von GMSAutocompleteViewController und weisen Sie den übergeordneten Ansichtscontroller als Delegateigenschaft zu.
  4. Präsentieren Sie den GMSAutocompleteViewController mithilfe von [self presentViewController...].
  5. Behandeln Sie die Auswahl des Nutzers in der Delegatmethode didAutocompleteWithPlace.
  6. Blenden Sie den Controller in den Delegatmethoden didAutocompleteWithPlace, didFailAutocompleteWithError und wasCancelled aus.

Das folgende Beispiel veranschaulicht eine Möglichkeit zum Starten von GMSAutocompleteViewController als Reaktion auf das Antippen einer Schaltfläche durch einen Nutzer.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  // Present the Autocomplete view controller when the button is pressed.
  @IBAction func autocompleteClicked(_ sender: UIButton) {
    let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self
    present(autocompleteController, animated: true, completion: nil)
  }
}

extension ViewController: GMSAutocompleteViewControllerDelegate {

  // Handle the user's selection.
  func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
    dismiss(animated: true, completion: nil)
  }

  func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // User canceled the operation.
  func wasCancelled(_ viewController: GMSAutocompleteViewController) {
    dismiss(animated: true, completion: nil)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }

}

Objective-C

#import "ViewController.h"
#import <GooglePlaces/GooglePlaces.h>

@interface ViewController () <GMSAutocompleteViewControllerDelegate>

@end

@implementation ViewController

...

// Present the autocomplete view controller when the button is pressed.
- (IBAction)onLaunchClicked:(id)sender {
  GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init];
  acController.delegate = self;
  [self presentViewController:acController animated:YES completion:nil];
}

// Handle the user's selection.
- (void)viewController:(GMSAutocompleteViewController *)viewController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)viewController:(GMSAutocompleteViewController *)viewController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// User canceled the operation.
- (void)wasCancelled:(GMSAutocompleteViewController *)viewController {
  [self dismissViewControllerAnimated:YES completion:nil];
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

@end

Ergebniscontroller hinzufügen

Verwenden Sie einen Ergebniscontroller, wenn Sie mehr Kontrolle für die UI zur Texteingabe wünschen. Mit dem Ergebniscontroller wird ein dynamisches Umschalten der Sichtbarkeit der Ergebnisliste abhängig vom Fokus der Eingabe-UI realisiert.

Um Ihrer App einen Ergebniscontroller hinzuzufügen, gehen Sie wie folgt vor:

  1. Erstellen Sie einen GMSAutocompleteResultsViewController.
  2. Implementieren Sie das Protokoll GMSAutocompleteResultsViewControllerDelegate im übergeordneten Ansichtscontroller und weisen Sie den übergeordneten Ansichtscontroller der Delegateigenschaft zu.
  3. Erstellen Sie ein Objekt UISearchController, wobei Sie den GMSAutocompleteResultsViewController als Argument des Ergebniscontrollers übergeben.
  4. Legen Sie den GMSAutocompleteResultsViewController als die Eigenschaft searchResultsUpdater des UISearchController fest.
  5. Fügen Sie der UI Ihrer App searchBar als UISearchController hinzu.
  6. Behandeln Sie die Auswahl des Nutzers in der Delegatmethode didAutocompleteWithPlace.

Es gibt verschiedene Möglichkeiten zur Platzierung der Suchleiste eines UISearchController in der UI Ihrer App:

Suchleiste der Navigationsleiste hinzufügen

Im folgenden Codebeispiel wird das Hinzufügen eines Ergebniscontrollers veranschaulicht, wobei die searchBar der Navigationsleiste hinzugefügt und die Auswahl des Nutzers behandelt wird:

Swift

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Put the search bar in the navigation bar.
    searchController?.searchBar.sizeToFit()
    navigationItem.titleView = searchController?.searchBar

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Prevent the navigation bar from being hidden when searching.
    searchController?.hidesNavigationBarDuringPresentation = false
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                       initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Put the search bar in the navigation bar.
  [_searchController.searchBar sizeToFit];
  self.navigationItem.titleView = _searchController.searchBar;

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Prevent the navigation bar from being hidden when searching.
  _searchController.hidesNavigationBarDuringPresentation = NO;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
  didAutocompleteWithPlace:(GMSPlace *)place {
    _searchController.active = NO;
    // Do something with the selected place.
    NSLog(@"Place name %@", place.name);
    NSLog(@"Place address %@", place.formattedAddress);
    NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Hinweis: Damit die Suchleiste korrekt angezeigt wird, muss der Ansichtscontroller Ihrer App in einen UINavigationController eingeschlossen sein.

Suchleiste im oberen Bereich einer Ansicht hinzufügen

Im folgenden Codebeispiel wird das Hinzufügen der searchBar im oberen Bereich einer Ansicht veranschaulicht.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, height: 45.0))

    subView.addSubview((searchController?.searchBar)!)
    view.addSubview(subView)
    searchController?.searchBar.sizeToFit()
    searchController?.hidesNavigationBarDuringPresentation = false

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];

    _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
    _resultsViewController.delegate = self;

    _searchController = [[UISearchController alloc]
                             initWithSearchResultsController:_resultsViewController];
    _searchController.searchResultsUpdater = _resultsViewController;

    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 65.0, 250, 50)];

    [subView addSubview:_searchController.searchBar];
    [_searchController.searchBar sizeToFit];
    [self.view addSubview:subView];

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    self.definesPresentationContext = YES;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Standardmäßig blendet der UISearchController die Navigationsleiste bei der Darstellung aus (kann deaktiviert werden). In Fällen, in denen die Navigationsleiste sichtbar und nicht transparent ist, erfolgt keine korrekte Platzierung durch den UISearchController. Verwenden Sie zur Problemumgehung den folgenden Code:

Swift

navigationController?.navigationBar.translucent = false
searchController?.hidesNavigationBarDuringPresentation = false

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = true
self.edgesForExtendedLayout = .top

Objective-C

self.navigationController.navigationBar.translucent = NO;
_searchController.hidesNavigationBarDuringPresentation = NO;

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;

Suchleiste mit Popover-Ergebnissen hinzufügen

Im folgenden Codebeispiel werden die Platzierung einer Suchleiste auf der rechten Seite der Navigationsleiste und die Anzeige von Ergebnissen in einem Popover veranschaulicht.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Add the search bar to the right of the nav bar,
    // use a popover to display the results.
    // Set an explicit size as we don't want to use the entire nav bar.
    searchController?.searchBar.frame = (CGRect(x: 0, y: 0, width: 250.0, height: 44.0))
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: (searchController?.searchBar)!)

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Keep the navigation bar visible.
    searchController?.hidesNavigationBarDuringPresentation = false
    searchController?.modalPresentationStyle = .popover
  }
}
// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];

  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                           initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Add the search bar to the right of the nav bar,
  // use a popover to display the results.
  // Set an explicit size as we don't want to use the entire nav bar.
  _searchController.searchBar.frame = CGRectMake(0, 0, 250.0f, 44.0f);
  self.navigationItem.rightBarButtonItem =
  [[UIBarButtonItem alloc] initWithCustomView:_searchController.searchBar];

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Keep the navigation bar visible.
  _searchController.hidesNavigationBarDuringPresentation = NO;

  _searchController.modalPresentationStyle = UIModalPresentationPopover;
}

// Handle the user's selection.
- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
- (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Hinweis: Damit die Suchleiste korrekt angezeigt wird, muss der Ansichtscontroller Ihrer App in einen UINavigationController eingeschlossen sein.

Tabelle als Datenquelle verwenden

Wenn Ihre App iOS 7 unterstützen soll, können Sie die Klasse GMSAutocompleteTableDataSource für eine Tabellenansicht eines UISearchDisplayController verwenden.

So verwenden Sie GMSAutocompleteTableDataSource zur Anzeige eines Suchcontrollers:

  1. Implementieren Sie die Protokolle GMSAutocompleteTableDataSourceDelegate und UISearchDisplayDelegate im übergeordneten Ansichtscontroller.
  2. Erstellen Sie eine Instanz von GMSAutocompleteTableDataSource und weisen Sie den übergreifenden Ansichtscontroller als Delegateigenschaft zu.
  3. Erstellen Sie eine Instanz von UISearchDisplayController.
  4. Fügen Sie der UI Ihrer App searchBar als UISearchController hinzu.
  5. Behandeln Sie die Auswahl des Nutzers in der Delegatmethode didAutocompleteWithPlace.
  6. Blenden Sie den Controller in den Delegatmethoden didAutocompleteWithPlace, didFailAutocompleteWithError und wasCancelled aus.

Im folgenden Codebeispiel wird die Verwendung der Klasse GMSAutocompleteTableDataSource für die Tabellenansicht eines [UISearchDisplayController] veranschaulicht().

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController, UISearchDisplayDelegate {

  var searchBar: UISearchBar?
  var tableDataSource: GMSAutocompleteTableDataSource?
  var searchDisplayController: UISearchDisplayController?

  override func viewDidLoad() {
    super.viewDidLoad()

    searchBar = UISearchBar(CGRect(x: 0, y: 0, width: 250.0, height: 44.0))

    tableDataSource = GMSAutocompleteTableDataSource()
    tableDataSource?.delegate = self

    searchDisplayController = UISearchDisplayController(searchBar: searchBar!, contentsController: self)
    searchDisplayController?.searchResultsDataSource = tableDataSource
    searchDisplayController?.searchResultsDelegate = tableDataSource
    searchDisplayController?.delegate = self

    view.addSubview(searchBar!)
  }

  func didUpdateAutocompletePredictionsForTableDataSource(tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator off.
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    // Reload table data.
    searchDisplayController?.searchResultsTableView.reloadData()
  }

  func didRequestAutocompletePredictionsForTableDataSource(tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator on.
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    // Reload table data.
    searchDisplayController?.searchResultsTableView.reloadData()
  }

}

extension ViewController: GMSAutocompleteTableDataSourceDelegate {
  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWithPlace place: GMSPlace) {
    searchDisplayController?.active = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
    tableDataSource?.sourceTextHasChanged(searchString)
    return false
  }

  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: NSError) {
    // TODO: Handle the error.
    print("Error: \(error.description)")
  }

  func tableDataSource(tableDataSource: GMSAutocompleteTableDataSource, didSelectPrediction prediction: GMSAutocompletePrediction) -> Bool {
    return true
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, 250.0f, 44.0f)];

  _tableDataSource = [[GMSAutocompleteTableDataSource alloc] init];
  _tableDataSource.delegate = self;

  _searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar
                                                               contentsController:self];
  _searchDisplayController.searchResultsDataSource = _tableDataSource;
  _searchDisplayController.searchResultsDelegate = _tableDataSource;
  _searchDisplayController.delegate = self;

  [self.view addSubview:_searchBar];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
  [_tableDataSource sourceTextHasChanged:searchString];
  return NO;
}

// Handle the user's selection.
- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
  didAutocompleteWithPlace:(GMSPlace *)place {
  [_searchDisplayController setActive:NO animated:YES];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
  didFailAutocompleteWithError:(NSError *)error {
  [_searchDisplayController setActive:NO animated:YES];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

- (void)didUpdateAutocompletePredictionsForTableDataSource:
  (GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator off.
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  // Reload table data.
  [_searchDisplayController.searchResultsTableView reloadData];
}

- (void)didRequestAutocompletePredictionsForTableDataSource:
  (GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator on.
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  // Reload table data.
  [_searchDisplayController.searchResultsTableView reloadData];
}

Hinweis: Die API UISearchDisplayController unterstützt nicht das Konzept asynchroner Datenaktualisierungen. Daher müssen Tabellenaktualisierungen durch Neuladen von Tabellendaten in die Methoden didUpdateAutocompletePredictions und didRequestAutocompletePredictions des Protokolls GMSAutoCompleteResultsDelegate erzwungen werden.

Text- und Hintergrundfarben anpassen

Sie können die Farben des gesamten Texts und Hintergrunds im UI-Steuerelement zur automatischen Vervollständigung festlegen, damit das Widget den visuellen Erscheinungsbild Ihrer App besser entspricht. Es gibt zwei Möglichkeiten, die Farben des UI-Steuerelements festzulegen:

  • Mit dem nativen iOS-Protokoll UIAppearance zur globalen Formatierung von UI-Steuerelementen, wann immer das möglich ist. Diese Einstellungen gelten für viele Elemente der UI-Steuerelemente, aber nicht für alle.
  • Mit den SDK-Methoden für die Widgetklassen, um Eigenschaften festzulegen, die durch das Protokoll UIAppearance nicht unterstützt werden.

In der Regel verwenden Sie in Ihrer App eine Kombination aus dem Protokoll UIAppearance und den SDK-Methoden. In der folgenden Grafik wird gezeigt, welche Elemente Sie formatieren können:

Farben des UI-Steuerelements zur automatischen Vervollständigung

In der folgenden Tabelle sind alle UI-Elemente aufgeführt. Darüber hinaus wird angegeben, wie sie jeweils formatiert werden müssen (mit dem Protokoll UIAppearance oder einer SDK-Methode).

UI-Element Methode Vorgehensweise zur Formatierung
Farbton der Navigationsleiste (Hintergrund) Protokoll UIAppearance Aufruf von setBarTintColor für Proxy UINavigationBar
Farbton der Navigationsleiste (Cursor für Suchleistentext und Schaltfläche zum Abbrechen) Protokoll UIAppearance Aufruf von setTintColor für Proxy UINavigationBar
Textfarbe der Suchleiste Protokoll UIAppearance NSForegroundColorAttributeName in searchBarTextAttributes festlegen
Farbton der Suchleiste - Die Suchleiste ist transparent; sie wird als schattierte Version der Navigationsleiste dargestellt.
Platzhalter-Textfarbe für Suchleiste (Standardsuchtext) Protokoll UIAppearance NSForegroundColorAttributeName in placeholderAttributes festlegen
Primärer Text (auch für Fehler- und Nachrichtentexte) SDK-Methode Aufruf von primaryTextColor
Hervorhebung des primären Texts SDK-Methode Aufruf von primaryTextHighlightColor
Sekundärer Text SDK-Methode Aufruf von secondaryTextColor
Fehler- und Nachrichtentext SDK-Methode Aufruf von primaryTextColor
Hintergrund von Tabellenzellen SDK-Methode Aufruf von tableCellBackgroundColor
Farbe von Tabellenzellenteilern SDK-Methode Aufruf von tableCellSeparatorColor
Schaltfläche „Try Again“ SDK-Methode Aufruf von tintColor
Aktivitätsanzeige (Spinner zur Anzeige des Fortschritts) Protokoll UIAppearance Aufruf von setColor für Proxy UIActivityIndicatorView
Logo „Powered by Google“, Bild von trauriger Wolke - Abhängig vom Hintergrundkontrast wird automatisch die graue oder weiße Version gewählt.
Lupe und Klarschriftsymbole im Textfeld der Suchleiste - Zur Formatierung ersetzen Sie die Standardbilder mit Bildern der gewünschten Farbe.

Hinweis: Diese Eigenschaften beeinflussen nur die Farbeinstellungen der UI-Elemente. Die Änderung der Größe von UI-Elementen oder der in Tabellenzellen verwendeten Schriftart wird nicht unterstützt.

Mit dem Protokoll UIAppearance

Mit dem Protokoll UIAppearance können Sie den Appearance-Proxy für ein bestimmtes UI-Element abrufen, mit dem Sie dann die Farbe des UI-Elements festlegen können. Wenn eine Änderung vorgenommen wird, sind alle Instanzen des jeweiligen UI-Elements betroffen. So wird im folgenden Beispiel global die Farbe von UITextField-Klassen in Grün geändert, wenn sie in einer UISearchBar enthalten sind:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil]
    setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];

Weitere Informationen zur Definition von Farbwerten finden Sie in der Referenz zur Klasse UIColor.

Die folgenden Code-Snippets zeigen alle Proxy-Befehle, die Sie benötigen, um sämtliche Aspekte des UI-Vollbildsteuerelements zur automatischen Vervollständigung formatieren zu können. Fügen Sie diesen Code der Methode didFinishLaunchingWithOptions in Appdelegate.m hinzu:

// Define some colors.
UIColor *darkGray = [UIColor darkGrayColor];
UIColor *lightGray = [UIColor lightGrayColor];

// Navigation bar background.
[[UINavigationBar appearance] setBarTintColor:darkGray];
[[UINavigationBar appearance] setTintColor:lightGray];

// Color of typed text in the search bar.
NSDictionary *searchBarTextAttributes = @{
                                          NSForegroundColorAttributeName: lightGray,
                                          NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                          };
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .defaultTextAttributes = searchBarTextAttributes;

// Color of the placeholder text in the search bar prior to text entry.
NSDictionary *placeholderAttributes = @{
                                        NSForegroundColorAttributeName: lightGray,
                                        NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                        };

// Color of the default search text.
// NOTE: In a production scenario, "Search" would be a localized string.
NSAttributedString *attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"Search"
                                attributes:placeholderAttributes];
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .attributedPlaceholder = attributedPlaceholder;

// Color of the in-progress spinner.
[[UIActivityIndicatorView appearance] setColor:lightGray];

// To style the two image icons in the search bar (the magnifying glass
// icon and the 'clear text' icon), replace them with different images.
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x_high"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateHighlighted];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateNormal];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_search"]
                    forSearchBarIcon:UISearchBarIconSearch
                            state:UIControlStateNormal];

// Color of selected table cells.
UIView *selectedBackgroundView = [[UIView alloc] init];
selectedBackgroundView.backgroundColor = [UIColor lightGrayColor];
[UITableViewCell appearanceWhenContainedIn:[GMSAutocompleteViewController class], nil]
    .selectedBackgroundView = selectedBackgroundView;

Formateigenschaften für UI-Steuerelemente festlegen

Eine Untermenge der UI-Steuerelemente verfügt über Eigenschaften, die durch das Protokoll UIAppearance nicht beeinflusst werden und daher direkt festgelegt werden müssen. Im folgenden Codebeispiel wird veranschaulicht, wie Vordergrund- und Hintergrundfarben definiert und auf eine UI-Steuerelementinstanz namens acController angewendet werden. Fügen Sie diesen Code der Methode onLaunchClicked in ViewController.m hinzu:

UIColor <em>darkGray = [UIColor darkGrayColor];
UIColor </em>lightGray = [UIColor lightGrayColor];</p>
<p>acController.secondaryTextColor = [UIColor colorWithWhite:1.0f alpha:0.5f];
acController.primaryTextColor = lightGray;
acController.primaryTextHighlightColor = [UIColor grayColor];
acController.tableCellBackgroundColor = darkGray;
acController.tableCellSeparatorColor = lightGray;
acController.tintColor = lightGray;

Hinweis: Für GMSAutocompleteViewController und GMSAutocompleteResultsViewController können Sie zum Festlegen der Werte Interface Builder verwenden.

Ortsvorschläge programmgesteuert abrufen

Als Alternative zur UI, die durch das Widget für die automatische Vervollständigung bereitgestellt wird, können Sie eine UI für benutzerdefinierte Suchen erstellen. Hierzu muss Ihre App programmgesteuert Ortsvorschläge abrufen. Für Ihre App gibt es die folgenden Möglichkeiten, eine Liste vorgeschlagener Ortsnamen und/oder Adressen abzurufen:

Aufruf von GMSPlacesClient

Um eine Liste der vorgeschlagenen Ortsnamen und/oder Adressen abzurufen, rufen Sie die Methode GMSPlacesClient autocompleteQuery:bounds:filter:callback: mit den folgenden Parametern auf:

  • Eine Zeichenfolge autocompleteQuery mit dem vom Nutzer eingegebenen Text.
  • Ein Objekt GMSCoordinateBounds zur Bevorzugung einer bestimmten Gegend, angegeben durch Breitengrad- und Längengrad.
  • Ein GMSAutocompleteFilter GMSAutocompleteFilter , der die Ergebnisse auf einen bestimmten Ortstyp einschränkt. Um alle Typen abzurufen, geben Sie den Wert nil ein. Die folgenden Ortstypen werden vom Filter unterstützt:

    • kGMSPlacesAutocompleteTypeFilterNoFilter – Ein leerer Filter; alle Ergebnisse werden zurückgegeben.
    • kGMSPlacesAutocompleteTypeFilterGeocode– Gibt nur Geocoding-Ergebnisse und keine Unternehmen zurück. Verwenden Sie diese Anforderung, um die Ergebnisse eindeutig zu machen, wenn der angegebene Standort unbestimmt sein kann.
    • kGMSPlacesAutocompleteTypeFilterAddress– Gibt nur automatisch vervollständigte Ergebnisse mit einer exakten Adresse zurück. Verwenden Sie diesen Typ, wenn Sie sicher sind, dass Nutzer vollständig angegebene Adressen suchen.
    • kGMSPlacesAutocompleteTypeFilterEstablishment– Gibt als Ergebnisse ausschließlich Unternehmen zurück.
    • kGMSPlacesAutocompleteTypeFilterRegion – Gibt ausschließlich Orte zurück, die einem der folgenden Typen entsprechen:

      • locality
      • sublocality
      • postal_code
      • country
      • administrative_area_level_1
      • administrative_area_level_2
    • kGMSPlacesAutocompleteTypeFilterCity – Gibt ausschließlich Ergebnisse zurück, die locality oderadministrative_area_level_3 entsprechen.

Weitere Informationen finden Sie unter Ortstypen.

  • Eine Callbackmethode, um die zurückgegebenen Vorschläge handhaben zu können.

Das folgenden Codebeispiele zeigen einen vereinfachten Aufruf von autocompleteQuery:bounds:filter:callback:.

Swift

func placeAutocomplete() {
  let filter = GMSAutocompleteFilter()
  filter.type = .establishment
  placesClient.autocompleteQuery("Sydney Oper", bounds: nil, filter: filter, callback: {(results, error) -> Void in
    if let error = error {
      print("Autocomplete error \(error)")
      return
    }
    if let results = results {
      for result in results {
        print("Result \(result.attributedFullText) with placeID \(result.placeID)")
      }
    }
  })
}

Objective-C

- (void)placeAutocomplete {

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

[_placesClient autocompleteQuery:@"Sydney Oper"
                          bounds:nil
                          filter:filter
                        callback:^(NSArray *results, NSError *error) {
                          if (error != nil) {
                            NSLog(@"Autocomplete error %@", [error localizedDescription]);
                            return;
                          }

                          for (GMSAutocompletePrediction* result in results) {
                            NSLog(@"Result '%@' with placeID %@", result.attributedFullText.string, result.placeID);
                          }
                        }];
}

Die API ruft die angegebene Callbackmethode auf und übergibt ein Array von Objekten vom Typ GMSAutocompletePrediction.

Jedes Objekt GMSAutocompletePrediction enthält die folgenden Informationen:

attributedFullText– Der vollständige Text des Vorschlags in Form eines NSAttributedString. Beispiel: „Opernhaus Sydney, Sydney, New South Wales, Australien“. Jeder Textbereich, der mit der Nutzereingabe übereinstimmt, hat das Attribut kGMSAutocompleteMatchAttribute. Sie können mit diesem Attribut den übereinstimmenden Text in der Nutzerabfrage hervorheben (wie im Beispiel unten). - placeID– Die Orts-ID des vorgeschlagenen Orts. Die Orts-ID ist eine ID in Textform, mit der ein Ort eindeutig bezeichnet wird. Weitere Informationen zu Orts-IDs finden Sie in der Übersicht über Orts-ID.

Mit dem folgenden Beispielcode wird veranschaulicht, wie Sie mit enumerateAttribute die Teile im Ergebnis fett hervorheben, die dem Text der Nutzereingabe entsprechen:

Swift

let regularFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
let boldFont = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)

let bolded = prediction.attributedFullText.mutableCopy() as! NSMutableAttributedString
bolded.enumerateAttribute(kGMSAutocompleteMatchAttribute, in: NSMakeRange(0, bolded.length), options: []) {
  (value, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
    let font = (value == nil) ? regularFont : boldFont
    bolded.addAttribute(NSFontAttributeName, value: font, range: range)
}

label.attributedText = bolded
    

Objective-C

UIFont *regularFont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
UIFont *boldFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];

NSMutableAttributedString *bolded = [prediction.attributedFullText mutableCopy];
[bolded enumerateAttribute:kGMSAutocompleteMatchAttribute
                   inRange:NSMakeRange(0, bolded.length)
                   options:0
                usingBlock:^(id value, NSRange range, BOOL *stop) {
                  UIFont *font = (value == nil) ? regularFont : boldFont;
                  [bolded addAttribute:NSFontAttributeName value:font range:range];
                }];

label.attributedText = bolded;
    

Mit dem Fetcher

Wenn Sie von Grund auf ein eigenes Autocomplete-Steuerelement neu erstellen möchten, können Sie GMSAutocompleteFetcher verwenden, wodurch die Methode autocompleteQuery für GMSPlacesClient umschlossen wird. Der Fetcher drosselt Anforderungen, indem nur Ergebnisse für den zuletzt eingegebenen Suchtext zurückgegeben werden. Er stellt keine UI-Elemente bereit.

Zum Implementierung von GMSAutocompleteFetcher gehen Sie wie folgt vor:

  1. Implementieren Sie das Protokoll GMSAutocompleteFetcherDelegate.
  2. Erstellen Sie ein Objekt GMSAutocompleteFetcher.
  3. Rufen Sie sourceTextHasChanged als Nutzertypen für den Fetcher auf.
  4. Behandeln Sie Vorschläge und Fehler mit den Protokollmethoden didAutcompleteWithPredictions und didFailAutocompleteWithError.

Das folgende Codebeispiel veranschaulicht, wie mit dem Fetcher Nutzereingaben entgegengenommen und Übereinstimmungen in einer Textansicht angezeigt werden. Die Funktionalität zur Auswahl eines Orts wurde ausgelassen. FetcherSampleViewController ist von UIViewController in FetcherSampleViewController.h abgeleitet.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var textField: UITextField?
  var resultText: UITextView?
  var fetcher: GMSAutocompleteFetcher?

  override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .white
    edgesForExtendedLayout = []

    // Set bounds to inner-west Sydney Australia.
    let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366,
                                                longitude: 151.134002)
    let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725,
                                                longitude: 151.200349)
    let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
                                     coordinate: swBoundsCorner)

    // Set up the autocomplete filter.
    let filter = GMSAutocompleteFilter()
    filter.type = .establishment

    // Create the fetcher.
    fetcher = GMSAutocompleteFetcher(bounds: bounds, filter: filter)
    fetcher?.delegate = self

    textField = UITextField(frame: CGRect(x: 5.0, y: 10.0,
                                          width: view.bounds.size.width - 5.0,
                                          height: 44.0))
    textField?.autoresizingMask = .flexibleWidth
    textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),
                         for: .editingChanged)

    resultText = UITextView(frame: CGRect(x: 0, y: 45.0,
                                          width: view.bounds.size.width,
                                          height: view.bounds.size.height - 45.0))
    resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0)
    resultText?.text = "No Results"
    resultText?.isEditable = false

    view.addSubview(textField!)
    view.addSubview(resultText!)
  }

  func textFieldDidChange(textField: UITextField) {
    fetcher?.sourceTextHasChanged(textField.text!)
  }

}

extension ViewController: GMSAutocompleteFetcherDelegate {
  func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
    let resultsStr = NSMutableString()
    for prediction in predictions {
      resultsStr.appendFormat("%@\n", prediction.attributedPrimaryText)
    }

    resultText?.text = resultsStr as String
  }

  func didFailAutocompleteWithError(_ error: Error) {
    resultText?.text = error.localizedDescription
  }

}

Objective-C

#import "FetcherSampleViewController.h"
#import <GooglePlaces/GooglePlaces.h>

@interface FetcherSampleViewController () <GMSAutocompleteFetcherDelegate>

@end

@implementation FetcherSampleViewController {
  UITextField *_textField;
  UITextView *_resultText;
  GMSAutocompleteFetcher* _fetcher;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor whiteColor];
  self.edgesForExtendedLayout = UIRectEdgeNone;

  // Set bounds to inner-west Sydney Australia.
  CLLocationCoordinate2D neBoundsCorner = CLLocationCoordinate2DMake(-33.843366, 151.134002);
  CLLocationCoordinate2D swBoundsCorner = CLLocationCoordinate2DMake(-33.875725, 151.200349);
  GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:neBoundsCorner
                                                                     coordinate:swBoundsCorner];

  // Set up the autocomplete filter.
  GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
  filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

  // Create the fetcher.
  _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:bounds
                                                     filter:filter];
  _fetcher.delegate = self;

  // Set up the UITextField and UITextView.
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f,
                                                             0,
                                                             self.view.bounds.size.width - 5.0f,
                                                             44.0f)];
  _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  [_textField addTarget:self
                 action:@selector(textFieldDidChange:)
       forControlEvents:UIControlEventEditingChanged];
  _resultText =[[UITextView alloc] initWithFrame:CGRectMake(0,
                                                            45.0f,
                                                            self.view.bounds.size.width,
                                                            self.view.bounds.size.height - 45.0f)];
  _resultText.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1.0f];
  _resultText.text = @"No Results";
  _resultText.editable = NO;
  [self.view addSubview:_textField];
  [self.view addSubview:_resultText];
}

- (void)textFieldDidChange:(UITextField *)textField {
  NSLog(@"%@", textField.text);
  [_fetcher sourceTextHasChanged:textField.text];
}

#pragma mark - GMSAutocompleteFetcherDelegate
- (void)didAutocompleteWithPredictions:(NSArray *)predictions {
  NSMutableString *resultsStr = [NSMutableString string];
  for (GMSAutocompletePrediction *prediction in predictions) {
      [resultsStr appendFormat:@"%@\n", [prediction.attributedPrimaryText string]];
  }
  _resultText.text = resultsStr;
}

- (void)didFailAutocompleteWithError:(NSError *)error {
  _resultText.text = [NSString stringWithFormat:@"%@", error.localizedDescription];
}

@end

GMSCoordinateBounds für die automatische Vervollständigung festlegen

Sie können der Autocomplete-Funktion GMSCoordinateBounds übergeben, um die bereitgestellten Ergänzungen zu steuern. Beispiel: Wenn Sie bereits eine Google-Karte in Ihrem Ansichtscontroller haben, können Sie die Grenzwerte des aktuellen Viewports verwenden, um die Ergebnisse der automatischen Vervollständigung zu beeinflussen.

Swift

func placeAutocomplete() {
  let visibleRegion = mapView.projection.visibleRegion()
  let bounds = GMSCoordinateBounds(coordinate: visibleRegion.farLeft, coordinate: visibleRegion.nearRight)

  let filter = GMSAutocompleteFilter()
  filter.type = .establishment
  placesClient.autocompleteQuery("Sydney Oper", bounds: bounds, filter: filter, callback: {
    (results, error) -> Void in
    guard error == nil else {
      print("Autocomplete error \(error)")
      return
    }
    if let results = results {
      for result in results {
        print("Result \(result.attributedFullText) with placeID \(result.placeID)")
      }
    }
  })
}

Objective-C

- (void)placeAutocomplete {

GMSVisibleRegion visibleRegion = self.mapView.projection.visibleRegion;
GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:visibleRegion.farLeft
                                                                   coordinate:visibleRegion.nearRight];
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.type = kGMSPlacesAutocompleteTypeFilterEstablishment;

[_placesClient autocompleteQuery:@"Sydney Oper"
                          bounds:bounds
                          filter:filter
                        callback:^(NSArray *results, NSError *error) {
                          if (error != nil) {
                            NSLog(@"Autocomplete error %@", [error localizedDescription]);
                            return;
                          }

                          for (GMSAutocompletePrediction* result in results) {
                            NSLog(@"Result '%@' with placeID %@", result.attributedFullText.string, result.placeID);
                          }
                        }];
}

Nutzungsbeschränkungen

Zuordnungen in der App anzeigen

  • Wenn der Dienst zur automatischen Vervollständigung in Ihrer App programmgesteuert verwendet wird, muss Ihre UI entweder eine Zuordnung „Powered by Google“ anzeigen oder innerhalb einer Karte mit der die Markenkennzeichnung Google erscheinen.
  • Wenn in Ihrer App das UI-Steuerelement zur automatischen Vervollständigung verwendet wird, sind keine weiteren Aktionen erforderlich (die erforderliche Zuordnung wird standardmäßig angezeigt).
  • Wenn Sie nach dem Anfordern eines Orts anhand einer ID zusätzliche Ortsinformationen abrufen und anzeigen, müssen Sie auch eine Zuordnung für Inhalte Dritter anzeigen.

Weitere Informationen dazu finden Sie in der Dokumentation zu Zuordnungen.

Netzwerkaktivitätsanzeige

Zur Steuerung der Netzwerkaktivitätsanzeige in der Statusleiste von Anwendungen müssen Sie die geeigneten optionalen Delegatmethoden für die von Ihnen verwendete Klasse zur automatischen Vervollständigung (autocomplete) implementieren und die Netzwerkanzeige selbst ein- und ausschalten.

  • Für GMSAutocompleteViewController müssen Sie die Delegatmethoden didRequestAutocompletePredictions: und didUpdateAutocompletePredictions: implementieren.
  • Für GMSAutocompleteResultsViewController müssen Sie die Delegatmethoden didRequestAutocompletePredictionsForResultsController: und didUpdateAutocompletePredictionsForResultsController: implementieren.
  • Für GMSAutocompleteTableDataSource müssen Sie die Delegatmethoden didRequestAutocompletePredictionsForTableDataSource: und didUpdateAutocompletePredictionsForTableDataSource: implementieren.

Durch die Implementierung dieser Methoden und die Festlegung von [UIApplication sharedApplication].networkActivityIndicatorVisible auf YES bzw. NO entspricht die Statusleiste genau der UI zur automatischen Vervollständigung.

Fehlerbehebung

Es kann zwar eine Vielzahl unterschiedlicher Fehler auftreten, doch die meisten Fehler Ihrer App sind wahrscheinlich auf Konfigurationsfehler (zum Beispiel Verwendung des falschen API-Schlüssels oder fehlerhafte Konfiguration des API-Schlüssels) oder Kontingentfehler (Überschreitung des App-Kontingents) zurückzuführen. Weitere Informationen zu Kontingenten finden Sie unter Nutzungsbeschränkungen.

Fehler, die bei der Verwendung der Steuerelemente für die automatische Vervollständigung auftreten, werden in der Methode didFailAutocompleteWithError() der verschiedenen Delegatprotokolle zurückgegeben. Die Eigenschaft code des bereitgestellten Objekts NSError wird auf einen der Werte der Enumeration GMSPlacesErrorCode festgelegt.

Feedback geben zu...

location_on
Google Places API for iOS