«تکمیل خودکار جا» (قدیمی) پیشبینیهای جا را در پاسخ به پرسمانهای جستجوی کاربر برمیگرداند. همانطور که کاربر تایپ میکند، سرویس تکمیل خودکار پیشنهادهایی را برای مکانهایی مانند کسبوکارها، نشانیها، plus codes و نقاط جالب برمیگرداند.
میتوانید تکمیل خودکار را به روشهای زیر به برنامهتان اضافه کنید:
- کنترل میانای کاربر تکمیل خودکار اضافه کنید تا در زمان توسعه صرفهجویی کنید و تجربه کاربری یکپارچهای را تضمین کنید.
- پیشبینیهای مکان را بهصورت برنامهنویسیشده دریافت کنید تا تجربه کاربری سفارشیشدهای ایجاد کنید.
افزودن کنترل میانای کاربر تکمیل خودکار

کنترل میانای کاربر تکمیل خودکار یک کادر گفتگوی جستجو با عملکرد تکمیل خودکار داخلی است. وقتی کاربر عبارتهای جستجو را وارد میکند، کنترل فهرستی از مکانهای پیشبینیشده را برای انتخاب ارائه میدهد. وقتی کاربر انتخابی انجام میدهد، یک نمونه
GMSPlace
برگردانده میشود که برنامهتان میتواند از آن برای دریافت جزئیات درباره مکان انتخابشده استفاده کند.
میتوانید کنترل میانای کاربر تکمیل خودکار را به روشهای زیر به برنامهتان اضافه کنید:
افزودن کنترل تمامصفحه
وقتی میخواهید بافتار مدال داشته باشید، از کنترل تمامصفحه استفاده کنید، که در آن
واسط کاربر تکمیل خودکار بهطور موقت جایگزین واسط کاربر برنامه شما میشود تا زمانی که کاربر
انتخاب خود را انجام دهد. این عملکرد توسط کلاس
GMSAutocompleteViewController
ارائه میشود. وقتی کاربر مکانی را انتخاب میکند، برنامه شما یک فراخوانی برگشتی دریافت میکند.
برای افزودن کنترل تمامصفحه به برنامهتان:
- عنصر میانای کاربری در برنامه اصلیتان ایجاد کنید تا کنترل میانای کاربر تکمیل خودکار را راهاندازی کند،
برای مثال، یک کنترلکننده لمسی در
UIButton. - پروتکل
GMSAutocompleteViewControllerDelegateرا در کنترلکننده نمای والد پیادهسازی کنید. - نمونهای از
GMSAutocompleteViewControllerایجاد کنید و کنترلکننده نمای ولی را بهعنوان ویژگی نماینده اختصاص دهید. GMSPlaceFieldایجاد کنید تا انواع دادههای مکان را برای برگرداندن تعریف کنید.GMSAutocompleteFilterرا اضافه کنید تا پُرسمان را به نوع مکان خاصی محدود کنید.GMSAutocompleteViewControllerرا بااستفاده از[self presentViewController...]ارائه دهید.- انتخاب کاربر را در روش نماینده
didAutocompleteWithPlaceمدیریت کنید. - کنترلکننده را در روشهای نماینده
didAutocompleteWithPlace،didFailAutocompleteWithError، وwasCancelledرد کنید.
مثال زیر یک روش ممکن برای راهاندازی
GMSAutocompleteViewController
در پاسخ به تکضرب کاربر روی دکمه را نشان میدهد.
Swift
import UIKit import GooglePlaces class ViewController: UIViewController { override func viewDidLoad() { makeButton() } // Present the Autocomplete view controller when the button is pressed. @objc func autocompleteClicked(_ sender: UIButton) { let autocompleteController = GMSAutocompleteViewController() autocompleteController.delegate = self // Specify the place data types to return. let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) | UInt(GMSPlaceField.placeID.rawValue))! autocompleteController.placeFields = fields // Specify a filter. let filter = GMSAutocompleteFilter() filter.types = [kGMSPlaceTypeCollectionAddress] autocompleteController.autocompleteFilter = filter // Display the autocomplete view controller. present(autocompleteController, animated: true, completion: nil) } // Add a button to the view. func makeButton() { let btnLaunchAc = UIButton(frame: CGRect(x: 5, y: 150, width: 300, height: 35)) btnLaunchAc.backgroundColor = .blue btnLaunchAc.setTitle("Launch autocomplete", for: .normal) btnLaunchAc.addTarget(self, action: #selector(autocompleteClicked), for: .touchUpInside) self.view.addSubview(btnLaunchAc) } } extension ViewController: GMSAutocompleteViewControllerDelegate { // Handle the user's selection. func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { print("Place name: \(place.name)") print("Place ID: \(place.placeID)") 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 } }
آبجکتیو-سی
#import "ViewController.h" @import GooglePlaces; @interface ViewController () <GMSAutocompleteViewControllerDelegate> @end @implementation ViewController { GMSAutocompleteFilter *_filter; } - (void)viewDidLoad { [super viewDidLoad]; [self makeButton]; } // Present the autocomplete view controller when the button is pressed. - (void)autocompleteClicked { GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init]; acController.delegate = self; // Specify the place data types to return. GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID); acController.placeFields = fields; // Specify a filter. _filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; acController.autocompleteFilter = _filter; // Display the autocomplete view controller. [self presentViewController:acController animated:YES completion:nil]; } // Add a button to the view. - (void)makeButton{ UIButton *btnLaunchAc = [UIButton buttonWithType:UIButtonTypeCustom]; [btnLaunchAc addTarget:self action:@selector(autocompleteClicked) forControlEvents:UIControlEventTouchUpInside]; [btnLaunchAc setTitle:@"Launch autocomplete" forState:UIControlStateNormal]; btnLaunchAc.frame = CGRectMake(5.0, 150.0, 300.0, 35.0); btnLaunchAc.backgroundColor = [UIColor blueColor]; [self.view addSubview:btnLaunchAc]; } // 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 ID %@", place.placeID); 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
افزودن کنترلکننده نتایج
وقتی میخواهید کنترل بیشتری بر میانای کاربر ورودی نوشتار داشته باشید، از کنترلکننده نتایج استفاده کنید. کنترلکننده نتایج بهطور پویا نمایان بودن فهرست نتایج را براساس تمرکز رابط کاربری ورودی تغییر میدهد.
برای افزودن کنترلکننده نتایج به برنامهتان:
GMSAutocompleteResultsViewControllerایجاد کنید.- پروتکل
GMSAutocompleteResultsViewControllerDelegateرا در کنترلکننده نمای ولی پیادهسازی کنید و کنترلکننده نمای ولی را بهعنوان ویژگی نماینده اختصاص دهید.
- پروتکل
- یک شیء
UISearchControllerایجاد کنید وGMSAutocompleteResultsViewControllerرا بهعنوان آرگومان کنترلکننده نتایج ارسال کنید. GMSAutocompleteResultsViewControllerرا بهعنوان خصوصیتsearchResultsUpdaterازUISearchControllerتنظیم کنید.searchBarرا برایUISearchControllerبه میانای کاربر برنامهتان اضافه کنید.- انتخاب کاربر را در روش نماینده
didAutocompleteWithPlaceمدیریت کنید.
چندین روش برای قرار دادن نوار جستجوی UISearchController در
واسط کاربر برنامهتان وجود دارد:
- افزودن نوار جستجو به نوار پیمایش
- افزودن نوار جستجو به بالای نما
- افزودن نوار جستجو بااستفاده از نتایج پاپاور
افزودن نوار جستجو به نوار پیمایش
نمونه کد زیر نحوه افزودن کنترلکننده نتایج، افزودن
searchBar به نوار پیمایش، و مدیریت انتخاب کاربر را نشان میدهد:
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 } }
آبجکتیو-سی
- (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; }
افزودن نوار جستجو به بالای نما
نمونه کد زیر افزودن searchBar به بالای نما را نشان میدهد.
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 } }
آبجکتیو-سی
- (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; }
بهطور پیشفرض،
UISearchController
نوار پیمایش را هنگام ارائه پنهان میکند (این ویژگی را میتوان غیرفعال کرد). در مواردی که
نوار پیمایش نمایان و مات است، UISearchController
جایگذاری را بهدرستی تنظیم نمیکند.
از کد زیر بهعنوان راهحل موقت استفاده کنید:
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
آبجکتیو-سی
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;
افزودن نوار جستجو بااستفاده از نتایج پاپاور
نمونه کد زیر قرار دادن نوار جستجو در سمت راست نوار پیمایش و نمایش نتایج در پنجره بالاپر را نشان میدهد.
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 } }
آبجکتیو-سی
- (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; }
استفاده از منبع داده جدولی
اگر برنامهتان واسط کاربر نوشتار جستجوی سفارشی دارد، میتوانید از کلاس
GMSAutocompleteTableDataSource
برای هدایت نمای جدول نمایشدهنده نتایج در کنترلکننده نما استفاده کنید.
برای استفاده از
GMSAutocompleteTableDataSource
بهعنوان منبع داده و نماینده
UITableView
در کنترلکننده نما:
- پروتکلهای
GMSAutocompleteTableDataSourceDelegateوUISearchBarDelegateرا در کنترلکننده نما پیادهسازی کنید. - نمونه
GMSAutocompleteTableDataSourceایجاد کنید و کنترلکننده نما را بهعنوان ویژگی نماینده اختصاص دهید. GMSAutocompleteTableDataSourceرا بهعنوان منبع داده تنظیم کنید و ویژگیهایUITableViewرا در کنترلکننده نما واگذار کنید.- در گرداننده ورودی نوشتار جستجو،
sourceTextHasChangedرا درGMSAutocompleteTableDataSourceفراخوانی کنید.- انتخاب کاربر را در روش نماینده
didAutocompleteWithPlaceمدیریت کنید.
- انتخاب کاربر را در روش نماینده
- کنترلکننده را در روشهای نماینده
didAutocompleteWithPlace،didFailAutocompleteWithError،wasCancelledرد کنید.
نمونه کد زیر استفاده از کلاس
GMSAutocompleteTableDataSource
را برای هدایت نمای جدول UIViewController هنگام اضافه شدن جداگانه UISearchBar نشان میدهد.
Swift
// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import GooglePlaces import UIKit class PlaceAutocompleteViewController: UIViewController { private var tableView: UITableView! private var tableDataSource: GMSAutocompleteTableDataSource! override func viewDidLoad() { super.viewDidLoad() let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: 44.0)) searchBar.delegate = self view.addSubview(searchBar) tableDataSource = GMSAutocompleteTableDataSource() tableDataSource.delegate = self tableView = UITableView(frame: CGRect(x: 0, y: 64, width: self.view.frame.size.width, height: self.view.frame.size.height - 44)) tableView.delegate = tableDataSource tableView.dataSource = tableDataSource view.addSubview(tableView) } } extension PlaceAutocompleteViewController: UISearchBarDelegate { func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // Update the GMSAutocompleteTableDataSource with the search text. tableDataSource.sourceTextHasChanged(searchText) } } extension PlaceAutocompleteViewController: GMSAutocompleteTableDataSourceDelegate { func didUpdateAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) { // Turn the network activity indicator off. UIApplication.shared.isNetworkActivityIndicatorVisible = false // Reload table data. tableView.reloadData() } func didRequestAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) { // Turn the network activity indicator on. UIApplication.shared.isNetworkActivityIndicatorVisible = true // Reload table data. tableView.reloadData() } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWith place: GMSPlace) { // Do something with the selected place. print("Place name: \(place.name)") print("Place address: \(place.formattedAddress)") print("Place attributions: \(place.attributions)") } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: Error) { // Handle the error. print("Error: \(error.localizedDescription)") } func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didSelect prediction: GMSAutocompletePrediction) -> Bool { return true } }
آبجکتیو-سی
// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #import "PlaceAutocompleteViewController.h" @import GooglePlaces; @import UIKit; @interface PlaceAutocompleteViewController () <GMSAutocompleteTableDataSourceDelegate, UISearchBarDelegate> @end @implementation PlaceAutocompleteViewController { UITableView *tableView; GMSAutocompleteTableDataSource *tableDataSource; } - (void)viewDidLoad { [super viewDidLoad]; UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)]; searchBar.delegate = self; [self.view addSubview:searchBar]; tableDataSource = [[GMSAutocompleteTableDataSource alloc] init]; tableDataSource.delegate = self; tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 44)]; tableView.delegate = tableDataSource; tableView.dataSource = tableDataSource; [self.view addSubview:tableView]; } #pragma mark - GMSAutocompleteTableDataSourceDelegate - (void)didUpdateAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource { // Turn the network activity indicator off. UIApplication.sharedApplication.networkActivityIndicatorVisible = NO; // Reload table data. [tableView reloadData]; } - (void)didRequestAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource { // Turn the network activity indicator on. UIApplication.sharedApplication.networkActivityIndicatorVisible = YES; // Reload table data. [tableView reloadData]; } - (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didAutocompleteWithPlace:(GMSPlace *)place { // Do something with the selected place. NSLog(@"Place name: %@", place.name); NSLog(@"Place address: %@", place.formattedAddress); NSLog(@"Place attributions: %@", place.attributions); } - (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didFailAutocompleteWithError:(NSError *)error { // Handle the error NSLog(@"Error %@", error.description); } - (BOOL)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didSelectPrediction:(GMSAutocompletePrediction *)prediction { return YES; } #pragma mark - UISearchBarDelegate - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { // Update the GMSAutocompleteTableDataSource with the search text. [tableDataSource sourceTextHasChanged:searchText]; } @end
سفارشیسازی کردن رنگهای نوشتار و پسزمینه
میتوانید رنگ همه نوشتارها و پسزمینهها را در کنترل میانای کاربر تکمیل خودکار تنظیم کنید تا ابزاره با ظاهر بصری برنامهتان مطابقت بیشتری داشته باشد. دو روش برای تنظیم رنگهای کنترل میانای کاربر وجود دارد:
- بااستفاده از پروتکل UIAppearance داخلی iOS برای سبکدهی سراسری به کنترلهای میانای کاربر درصورت امکان. این تنظیمات بر بسیاری از عناصر کنترل میانای کاربر اعمال میشود، اما نه همه آنها.
- بااستفاده از روشهای کیت توسعه نرمافزار در کلاسهای ابزاره برای تنظیم ویژگیهایی که توسط پروتکل UIAppearance پشتیبانی نمیشوند.
معمولاً برنامهتان از ترکیبی از پروتکل UIAppearance و روشهای کیت توسعه نرمافزار استفاده میکند. نمودار زیر نشان میدهد که کدام عناصر را میتوان سبکبندی کرد:

جدول زیر همه عناصر میانای کاربر را فهرست میکند و نشان میدهد که هرکدام چگونه باید سبکبندی شوند (پروتکل UIAppearance یا روش کیت توسعه نرمافزار).
| عنصر میانای کاربر | روش | آموزش مد |
|---|---|---|
| رنگ نوار پیمایش (پسزمینه) | پروتکل UIAppearance | تماس با setBarTintColor به شماره UINavigationBar پراکسی. |
| رنگ سایه «نوار پیمایش» (نشانگر درج نوشتار نوار جستجو و دکمه «لغو») | پروتکل UIAppearance | تماس با setTintColor به شماره UINavigationBar پراکسی. |
| رنگ نوشتار «نوار جستجو» | پروتکل UIAppearance | NSForegroundColorAttributeName را در searchBarTextAttributes تنظیم کنید. |
| رنگ سایهرنگ نوار جستجو | موجود نیست | نوار جستجو نیمهشفاف است و بهصورت نسخه سایهدار «نوار پیمایش» نمایش داده میشود. |
| رنگ نوشتار جایبان نوار جستجو (نوشتار جستجوی پیشفرض) | پروتکل UIAppearance | NSForegroundColorAttributeName را در placeholderAttributes تنظیم کنید. |
| نوشتار اصلی (به نوشتار خطا و پیام نیز اعمال میشود) | روش کیت توسعه نرمافزار | تماس با primaryTextColor. |
| برجسته کردن نوشتار اصلی | روش کیت توسعه نرمافزار | تماس با primaryTextHighlightColor. |
| نوشتار فرعی | روش کیت توسعه نرمافزار | تماس با secondaryTextColor. |
| خطا و نوشتار پیام | روش کیت توسعه نرمافزار | تماس با primaryTextColor. |
| پسزمینه سلول جدول | روش کیت توسعه نرمافزار | تماس با tableCellBackgroundColor. |
| رنگ جداکننده سلول جدول | روش کیت توسعه نرمافزار | تماس با tableCellSeparatorColor. |
| دکمه «امتحان مجدد» | روش کیت توسعه نرمافزار | تماس با tintColor. |
| نشانگر فعالیت (چرخنده پیشرفت) | پروتکل UIAppearance | تماس با setColor به شماره UIActivityIndicatorView پراکسی. |
| نشانواره «با پشتیبانی Google»، تصویر ابر غمگین | موجود نیست | نسخه سفید یا خاکستری بهطور خودکار براساس کنتراست پسزمینه انتخاب میشود. |
| نمادهای ذرهبین و پاک کردن نوشتار در فیلد نوشتاری «نوار جستجو» | موجود نیست | برای سبکبندی، تصاویر پیشفرض را با تصاویر رنگ دلخواه جایگزین کنید. |
استفاده از پروتکل UIAppearance
میتوانید از پروتکل UIAppearance استفاده کنید تا پراکسی ظاهر را برای عنصر میانای کاربر دادهشده دریافت کنید، سپس میتوانید از آن برای تنظیم رنگ عنصر میانای کاربر استفاده کنید. وقتی اصلاحی انجام میشود، همه نمونههای
عنصر میانای کاربر تحتتأثیر قرار میگیرند. برای مثال، نمونه زیر بهطور سراسری
رنگ نوشتار کلاسهای UITextField را وقتی در
UISearchBar قرار دارند به سبز تغییر میدهد:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];
برای اطلاعات بیشتر درباره تعریف مقادیر رنگ، به مرجع کلاس UIColor مراجعه کنید.
تکهکدهای زیر همه فرمانهای پراکسی را که باید برای سبکبندی همه چیز در کنترل میانای کاربر تکمیل خودکار تمامصفحه استفاده کنید نشان میدهد. این کد را به
روش didFinishLaunchingWithOptions در Appdelegate.m اضافه کنید:
// 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;
تنظیم ویژگیهای سبک کنترل میانای کاربر
زیرمجموعهای از عناصر کنترل میانای کاربر دارای ویژگیهایی هستند که تحتتأثیر پروتکل UIAppearance قرار نمیگیرند و بنابراین باید مستقیماً تنظیم شوند. نمونه کد زیر
نحوه تعریف رنگهای پیشزمینه و پسزمینه و اعمال آنها بر یک
نمونه کنترل میانای کاربر بهنام acController را نشان میدهد. این کد را به روش onLaunchClicked در ViewController.m اضافه کنید:
UIColor *darkGray = [UIColor darkGrayColor]; UIColor *lightGray = [UIColor lightGrayColor]; 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;
دریافت پیشبینیهای مکان بهصورت برنامهنویسیشده
میتوانید واسط کاربر جستجوی سفارشی را بهعنوان جایگزینی برای واسط کاربر ارائهشده توسط ابزاره تکمیل خودکار ایجاد کنید. برای انجام این کار، برنامهتان باید پیشبینیهای مکان را بهصورت برنامهنویسیشده دریافت کند. برنامهتان میتواند فهرست نامها و/یا نشانیهای پیشبینیشده مکان را به یکی از روشهای زیر دریافت کند:
درحال تماس با GMSPlacesClient findAutocompletePredictionsFromQuery:
برای دریافت فهرست نامها و/یا نشانیهای پیشبینیشده مکان، ابتدا GMSPlacesClient را نمونهسازی کنید،
سپس روش GMSPlacesClient
findAutocompletePredictionsFromQuery:
را با پارامترهای زیر فراخوانی کنید:
- رشته
autocompleteQueryحاوی نوشتار تایپشده توسط کاربر. GMSAutocompleteSessionTokenکه برای شناسایی هر جلسه بهصورت جداگانه استفاده میشود. برنامه شما باید برای هر تماس درخواست تکمیل خودکار، همان کد را ارسال کند، سپس آن کد را همراه با «شناسه جا» در تماس بعدی بهfetchPlacefromPlaceID:ارسال کند تا «جزئیات جا» را برای جایی که کاربر انتخاب کرده است بازیابی کند.- A
GMSAutocompleteFilterبه:- نتایج را به منطقه خاصی محدود یا متمایل میکند.
- نتایج را به نوع خاصی از مکان محدود کنید.
- شیء
GMSPlaceLocationBias/Restriction که نتایج را به منطقه خاصی که با مرزهای طول و عرض جغرافیایی مشخص شده است متمایل میکند.
- روش فراخوانی برای مدیریت پیشبینیهای برگرداندهشده.
نمونه کدهای زیر فراخوانی findAutocompletePredictionsFromQuery: را نشان میدهند.
Swift
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictions, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ let token = GMSAutocompleteSessionToken.init() // Create a type filter. let filter = GMSAutocompleteFilter() filter.types = [kGMSPlaceTypeBank] filter.locationBias = GMSPlaceRectangularLocationOption( northEastBounds, southWestBounds); placesClient?.findAutocompletePredictions(fromQuery: "cheesebu", filter: filter, sessionToken: token, callback: { (results, error) 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)") } } })
آبجکتیو-سی
/** * Create a new session token. Be sure to use the same token for calling * findAutocompletePredictionsFromQuery:, as well as the subsequent place details request. * This ensures that the user's query and selection are billed as a single session. */ GMSAutocompleteSessionToken *token = [[GMSAutocompleteSessionToken alloc] init]; // Create a type filter. GMSAutocompleteFilter *_filter = [[GMSAutocompleteFilter alloc] init]; _filter.types = @[ kGMSPlaceTypeBank ]; [_placesClient findAutocompletePredictionsFromQuery:@"cheesebu" filter:_filter sessionToken:token callback:^(NSArray<GMSAutocompletePrediction *> * _Nullable results, NSError * _Nullable error) { if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } if (results != nil) { for (GMSAutocompletePrediction *result in results) { NSLog(@"Result %@ with PlaceID %@", result.attributedFullText, result.placeID); } } }];
API روش فراخوانی مشخصشده را فراخوانی میکند و آرایهای از اشیاء
GMSAutocompletePrediction
را ارسال میکند.
هر
GMSAutocompletePrediction
شیء حاوی اطلاعات زیر است:
attributedFullText– نوشتار کامل پیشبینی، بهشکلNSAttributedString. برای مثال، «تالار اپرای سیدنی، سیدنی، نیو ساوت ولز، استرالیا». هر محدوده نوشتاری که با ورودی کاربر مطابقت داشته باشد، مشخصهkGMSAutocompleteMatchAttributeرا دارد. میتوانید از این مشخصه برای برجسته کردن نوشتار منطبق در پُرسمان کاربر استفاده کنید، برای مثال، همانطور که در زیر نشان داده شده است.placeID– شناسه مکان پیشبینیشده. شناسه مکان شناسهای متنی است که مکان را بهطور یکتا شناسایی میکند. برای اطلاعات بیشتر درباره شناسه مکان، به نمای کلی شناسه مکان مراجعه کنید.distanceMeters– فاصله مستقیم ازoriginمشخصشده تا مقصد. اگر ویژگیoriginتنظیم نشده باشد، هیچ مقدار مسافتی برگردانده نخواهد شد.
نمونه کد زیر نشان میدهد که چگونه بااستفاده از enumerateAttribute، بخشهایی از نتیجه را که با نوشتار موجود در پُرسمان کاربر مطابقت دارد بهصورت پررنگ برجسته کنید:
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
آبجکتیو-سی
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;
استفاده از واکِشگر
اگر میخواهید کنترل تکمیل خودکار خودتان را از ابتدا بسازید، میتوانید از
GMSAutocompleteFetcher استفاده کنید که
روش autocompleteQuery را در
GMSPlacesClient میپیچد. واکِشنده
درخواستها را محدود میکند و فقط نتایج مربوط به آخرین نوشتار جستجوی واردشده را برمیگرداند. هیچ عنصر میانای کاربری ارائه نمیدهد.
برای پیادهسازی
GMSAutocompleteFetcher،
مراحل زیر را دنبال کنید:
- پروتکل
GMSAutocompleteFetcherDelegateرا اجرا کنید. - یک شیء
GMSAutocompleteFetcherایجاد کنید. - وقتی کاربر تایپ میکند،
sourceTextHasChangedرا در واکِشگر فراخوانی کنید. - پیشبینیها و خطاها را بااستفاده از روشهای پروتکل
didAutcompleteWithPredictionsوdidFailAutocompleteWithErrorمدیریت کنید.
نمونه کد زیر استفاده از واکِشگر را برای دریافت ورودی کاربر و
نمایش مکانهای منطبق در نمای نوشتاری نشان میدهد. عملکرد انتخاب مکان حذف شده است. FetcherSampleViewController از UIViewController در
FetcherSampleViewController.h مشتق میشود.
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) // Set up the autocomplete filter. let filter = GMSAutocompleteFilter() filter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner) // Create a new session token. let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init() // Create the fetcher. fetcher = GMSAutocompleteFetcher(bounds: nil, filter: filter) fetcher?.delegate = self fetcher?.provide(token) textField = UITextField(frame: CGRect(x: 5.0, y: 10.0, width: view.bounds.size.width - 5.0, height: 64.0)) textField?.autoresizingMask = .flexibleWidth textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged) let placeholder = NSAttributedString(string: "Type a query...") textField?.attributedPlaceholder = placeholder resultText = UITextView(frame: CGRect(x: 0, y: 65.0, width: view.bounds.size.width, height: view.bounds.size.height - 65.0)) resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0) resultText?.text = "No Results" resultText?.isEditable = false self.view.addSubview(textField!) self.view.addSubview(resultText!) } @objc 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 Primary text: %@\n", prediction.attributedPrimaryText) resultsStr.appendFormat("Place ID: %@\n", prediction.placeID) } resultText?.text = resultsStr as String } func didFailAutocompleteWithError(_ error: Error) { resultText?.text = error.localizedDescription } }
آبجکتیو-سی
#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); GMSAutocompleteFilter *autocompleteFilter = [[GMSAutocompleteFilter alloc] init]; autocompleteFilter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner); // Create the fetcher. _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:nil 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
کدهای جلسه
کدهای جلسه، مراحل پُرسمان و انتخاب جستجوی تکمیل خودکار کاربر را برای اهداف صورتحساب در یک جلسه مجزا گروهبندی میکنند. جلسه زمانی شروع میشود که کاربر شروع به تایپ کردن پُرسمان میکند و زمانی پایان مییابد که مکانی را انتخاب میکند. هر جلسه میتواند چند پُرسمان داشته باشد و پساز آن یک مکان انتخاب شود. وقتی جلسهای بهپایان میرسد، آن کد دیگر معتبر نیست؛ برنامهتان باید برای هر جلسه کد جدیدی تولید کند. توصیه میکنیم از کد جلسه برای همه جلسههای تکمیل خودکار برنامهای استفاده کنید (وقتی از کنترلکننده تمامصفحه یا کنترلکننده نتایج استفاده میکنید، API بهطور خودکار این کار را انجام میدهد).
کیت توسعه نرمافزار مکانها برای iOS از
GMSAutocompleteSessionToken
برای شناسایی هر جلسه استفاده میکند. برنامه شما باید یک کد جلسه جدید را در ابتدای هر جلسه جدید ارسال کند، سپس همان کد را همراه با شناسه جا در فراخوانی بعدی به
fetchPlacefromPlaceID:
ارسال کند تا جزئیات جا را برای مکانی که توسط کاربر انتخاب شده است بازیابی کند.
از کد زیر برای تولید کد جلسه جدید استفاده کنید:
let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()
حدود استفاده
- استفاده از روش
GMSPlacesClient findAutocompletePredictionsFromQueryمشمول محدودیتهای پُرسمان لایهای است. اسناد مربوط به محدودیتهای استفاده را ببینید.
نمایش ارجاعها در برنامه شما
- اگر برنامهتان بهصورت برنامهنویسیشده از سرویس تکمیل خودکار استفاده میکند، واسط کاربریتان باید یا ذکر منبع «طراحیشده توسط Google» را نمایش دهد یا در نقشهای با نمانام Google ظاهر شود.
- اگر برنامهتان از کنترل میانای کاربر تکمیل خودکار استفاده میکند، اقدام دیگری لازم نیست (ارجاع لازم بهطور پیشفرض نمایش داده میشود).
- اگر پساز دریافت مکان با شناسه، اطلاعات مکان بیشتری را بازیابی و نمایش میدهید، باید ارجاعهای شخص ثالث را نیز نمایش دهید.
برای جزئیات بیشتر، به اسناد مربوط به ارجاعها مراجعه کنید.
کنترل کردن نشانگر فعالیت شبکه
برای کنترل نشانگر فعالیت شبکه در نوار وضعیت برنامهها، باید روشهای نماینده اختیاری مناسب را برای کلاس تکمیل خودکار مورداستفادهتان پیادهسازی کنید و نشانگر شبکه را خودتان روشن و خاموش کنید.
- برای
GMSAutocompleteViewControllerباید روشهای نمایندهdidRequestAutocompletePredictions:وdidUpdateAutocompletePredictions:را پیادهسازی کنید. - برای
GMSAutocompleteResultsViewControllerباید روشهای نمایندهdidRequestAutocompletePredictionsForResultsController:وdidUpdateAutocompletePredictionsForResultsController:را پیادهسازی کنید. - برای
GMSAutocompleteTableDataSourceباید روشهای نمایندهdidRequestAutocompletePredictionsForTableDataSource:وdidUpdateAutocompletePredictionsForTableDataSource:را پیادهسازی کنید.
با پیادهسازی این روشها و تنظیم [UIApplication
sharedApplication].networkActivityIndicatorVisible روی YES و NO
بهترتیب، نوار وضعیت بهدرستی با میانای کاربری تکمیل خودکار مطابقت خواهد داشت.
محدود کردن نتایج تکمیل خودکار
میتوانید کنترل میانای کاربر تکمیل خودکار را طوری تنظیم کنید که نتایج را به منطقه جغرافیایی خاصی محدود کند و/یا نتایج را براساس یک یا چند نوع مکان یا کشور یا کشورهای خاصی فیلتر کند. برای محدود کردن نتایج، میتوانید کارهای زیر را انجام دهید:
- برای ترجیح دادن (سوگیری) نتایج در منطقه تعریفشده،
locationBiasرا درGMSAutocompleteFilterتنظیم کنید (ممکن است برخیاز نتایج خارج از منطقه تعریفشده همچنان برگردانده شوند). اگرlocationRestrictionنیز تنظیم شده باشد،locationBiasنادیده گرفته خواهد شد. برای فقط نشان دادن (محدود کردن) نتایج در منطقه تعریفشده،
locationRestrictionرا رویGMSAutocompleteFilterتنظیم کنید (فقط نتایج در منطقه تعریفشده برگردانده خواهد شد).- توجه: این محدودیت فقط برای کل مسیرها اعمال میشود، نتایج ترکیبی واقع در خارج از مرزهای مستطیلی ممکن است براساس مسیری که با محدودیت مکان همپوشانی دارد برگردانده شود.
برای برگرداندن نتایجی که فقط با نوع مکان خاصی مطابقت دارند،
typesرا درGMSAutocompleteFilterتنظیم کنید (برای مثال، مشخص کردن kGMSPlaceTypeCollectionAddress باعث میشود ابزاره فقط نتایجی را برگرداند که نشانی دقیقی دارند).برای برگرداندن نتایج فقط در حداکثر پنج کشور مشخصشده،
countriesرا درGMSAutocompleteFilterتنظیم کنید.
نتایج را به منطقه خاصی متمایل کنید
برای ترجیح دادن (سوگیری) نتایج در منطقه تعریفشده، locationBias را در
GMSAutocompleteFilter تنظیم کنید، همانطور که در اینجا نشان داده شده است:
northEast = CLLocationCoordinate2DMake(39.0, -95.0); southWest =
CLLocationCoordinate2DMake(37.5, -100.0); GMSAutocompleteFilter *filter =
[[GMSAutocompleteFilter alloc] init]; filter.locationBias =
GMSPlaceRectangularLocationOption(northEast, southWest);
محدود کردن نتایج به منطقهای خاص
برای فقط نشان دادن (محدود کردن) نتایج در منطقه تعریفشده،
locationRestriction را در GMSAutocompleteFilter تنظیم کنید، همانطور که در اینجا نشان داده شده است:
northEast = CLLocationCoordinate2DMake(39.0, -95.0); southWest =
CLLocationCoordinate2DMake(37.5, -100.0); GMSAutocompleteFilter *filter =
[[GMSAutocompleteFilter alloc] init]; filter.locationRestriction =
GMSPlaceRectangularLocationOption(northEast, southWest);
فیلتر کردن نتایج براساس کشور
برای فیلتر کردن نتایج در حداکثر پنج کشور مشخصشده، countries را در
GMSAutocompleteFilter تنظیم کنید، همانطور که در اینجا نشان داده شده است:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];
فیلتر کردن نتایج براساس نوع مکان یا مجموعه نوع
با تنظیم ویژگی
types
GMSAutoCompleteFilter، نتایج را به نوع یا مجموعه نوع خاصی محدود کنید.
از این ویژگی برای مشخص کردن فیلترهای فهرستشده در جدولهای ۱، ۲، و ۳ در انواع
مکان استفاده کنید. اگر چیزی مشخص نشده باشد، همه انواع برگردانده میشوند.
برای مشخص کردن فیلتر نوع یا مجموعه نوع:
از ویژگی
typesبرای مشخص کردن حداکثر پنج مقدار نوع از جدول ۱ و جدول ۲ نشاندادهشده در انواع مکان استفاده کنید. مقادیر نوع توسط ثابتها درGMSPlaceTypeتعریف میشوند.از ویژگی
typesبرای مشخص کردن مجموعه نوع از «جدول ۳» نشاندادهشده در انواع مکان استفاده کنید. مقادیر مجموعه نوع توسط ثابتهای موجود درGMSPlaceTypeتعریف میشوند.فقط یک نوع از جدول ۳ در درخواست مجاز است. اگر مقداری از جدول ۳ مشخص کنید، نمیتوانید مقداری از جدول ۱ یا جدول ۲ مشخص کنید. اگر این کار را بکنید، خطایی رخ میدهد.
برای مثال، برای برگرداندن فقط نتایجی که با نوع مکان خاصی مطابقت دارند،
types را در GMSAutocompleteFilter تنظیم کنید. مثال زیر نشان میدهد که چگونه فیلتر را تنظیم کنید تا فقط نتایج دارای نشانی دقیق را برگرداند:
GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];
بهینهسازی «تکمیل خودکار جا (قدیمی)»
این بخش روالهای مطلوبی را شرح میدهد که به شما کمک میکند بیشترین بهره را از سرویس «تکمیل خودکار جا» (قدیمی) ببرید.
در اینجا چند دستورالعمل کلی ارائه شده است:
- سریعترین راه برای توسعه میانای کاربر فعال استفاده از ابزاره تکمیل خودکار جا (قدیمی) در Maps JavaScript API، ابزاره تکمیل خودکار جا (قدیمی) در Places SDK for Android، یا کنترل میانای کاربر تکمیل خودکار جا (قدیمی) در Places SDK for iOS است.
- از همان ابتدا، فیلدهای داده «تکمیل خودکار جا» (قدیمی) را درک کنید.
- فیلدهای سوگیری مکان و محدودیت مکان اختیاری هستند اما میتوانند تأثیر قابلتوجهی بر عملکرد تکمیل خودکار داشته باشند.
- از مدیریت خطا استفاده کنید تا مطمئن شوید که اگر میانای برنامهسازی کاربردی خطایی برگرداند، برنامه شما بهخوبی تنزل پیدا میکند.
- مطمئن شوید که برنامهتان وقتی انتخابی وجود ندارد، این وضعیت را مدیریت میکند و راهی برای ادامه دادن به کاربران ارائه میدهد.
روالهای مطلوب بهینهسازی هزینه
بهینهسازی هزینه پایه
برای بهینهسازی هزینه استفاده از سرویس «تکمیل خودکار جا» (قدیمی)، از ماسکهای فیلد در ابزارههای «جزئیات جا» (قدیمی) و «تکمیل خودکار جا» (قدیمی) استفاده کنید تا فقط فیلدهای داده «تکمیل خودکار جا» (قدیمی) موردنیازتان برگردانده شود.
بهینهسازی پیشرفته هزینه
پیادهسازی برنامهنویسیشده «تکمیل خودکار جا (قدیمی)» را برای دسترسی به SKU: تکمیل خودکار - قیمتگذاری بهازای درخواست و درخواست نتایج Geocoding API درباره مکان انتخابشده بهجای «جزئیات جا (قدیمی)» درنظر بگیرید. اگر هر دو شرط زیر برقرار باشد، قیمتگذاری بهازای درخواست همراه با Geocoding API مقرونبهصرفهتر از قیمتگذاری بهازای جلسه (جلسهمحور) است:
- اگر فقط به طول و عرض جغرافیایی یا نشانی مکان انتخابی کاربر نیاز دارید، Geocoding API این اطلاعات را با هزینه کمتری نسبتبه فراخوانی Place Details (Legacy) ارائه میدهد.
- اگر کاربران پیشبینی تکمیل خودکار را در میانگین چهار درخواست پیشبینی «تکمیل خودکار جا (قدیمی)» یا کمتر انتخاب کنند، قیمتگذاری براساس درخواست میتواند مقرونبهصرفهتر از قیمتگذاری براساس جلسه باشد.
| آنچه برنامه شما نیاز دارد | میانگین درخواستهای «تکمیل خودکار جا» (قدیمی) قبلاز اینکه کاربر پیشبینیای را انتخاب کند | پیادهسازی توصیهشده |
|---|---|---|
| جزئیات مکان بهغیراز نشانی و مکان، مثل نام مکان، وضعیت کسبوکار، یا ساعت کاری | هر شمارهای | «تکمیل خودکار جا» مبتنی بر جلسه (قدیمی) با «جزئیات جا» (قدیمی) |
| فقط نشانی و عرض/طول جغرافیایی پیشبینی انتخابشده | چهار یا کمتر | «تکمیل خودکار جا» (قدیمی) بهازای هر درخواست با Geocoding API |
| فقط نشانی و عرض/طول جغرافیایی پیشبینی انتخابشده | بیشتر از چهار | «تکمیل خودکار جا» مبتنی بر جلسه (قدیمی) برای برنامههای فقط نشانی |
Geocoding API میتواند گزینه مقرونبهصرفهتری نسبتبه Place Details (Legacy) برای برنامه شما باشد، بسته به عملکرد استفاده شما از Place Autocomplete (Legacy). کارایی «تکمیل خودکار جا» (قدیمی) هر برنامه بسته به آنچه کاربران وارد میکنند، جایی که برنامه استفاده میشود، و اینکه آیا روالهای مطلوب بهینهسازی عملکرد اجرا شدهاند یا نه متفاوت است.
برای پیدا کردن میانگین تعداد درخواستها برای جدول، تجزیهوتحلیل کنید که کاربر بهطور میانگین چند نویسه تایپ میکند تا پیشبینی «تکمیل خودکار جا (قدیمی)» را در برنامهتان انتخاب کند.
«تکمیل خودکار جا» مبتنی بر جلسه (قدیمی) با «جزئیات جا» (قدیمی)
از «تکمیل خودکار جا» (قدیمی) مبتنی بر جلسه با «جزئیات جا» (قدیمی) استفاده کنید.
ازآنجاییکه برنامه شما به «جزئیات جا (قدیمی)» نیاز دارد، مثل نام مکان، وضعیت کسبوکار،
یا ساعت کاری، پیادهسازی شما از «تکمیل خودکار جا (قدیمی)» باید از کد جلسه استفاده کند
(بهصورت برنامهنویسی یا تعبیهشده در
ابزارههای JavaScript،
Android،
یا iOS)
بهازای هر جلسه
بهعلاوه شناسههای محصول دادههای Places قابلاجرا،
بسته به اینکه کدام فیلدهای داده مکان را درخواست میکنید.۱
پیادهسازی ابزاره
مدیریت جلسه بهطور خودکار در ابزارههای
JavaScript،
Android،
یا iOS
ساخته میشود. این شامل درخواستهای «تکمیل خودکار جا» (قدیمی) و درخواست «جزئیات جا» (قدیمی)
در پیشبینی انتخابشده میشود. حتماً پارامتر fields را مشخص کنید تا مطمئن شوید فقط
فیلدهای داده «تکمیل خودکار جا (قدیمی)»
موردنیازتان را درخواست میکنید.
پیادهسازی برنامهای
از
کد جلسه
با درخواستهای «تکمیل خودکار جا» (قدیمی) استفاده کنید. هنگام درخواست «جزئیات مکان (قدیمی)» درباره پیشبینی انتخابشده، پارامترهای زیر را اضافه کنید:
- شناسه جا از پاسخ «تکمیل خودکار جا» (قدیمی)
- کد جلسه استفادهشده در درخواست «تکمیل خودکار جا» (قدیمی)
- پارامتر
fieldsکه فیلدهای داده «تکمیل خودکار جا» (قدیمی) موردنیازتان را مشخص میکند
Per-request Place Autocomplete (Legacy) with the Geocoding API
«تکمیل خودکار جا» (قدیمی) را بهصورت برنامهنویسیشده بدون کد جلسه پیادهسازی کنید و Geocoding API را در پیشبینی مکان انتخابشده فراخوانی کنید.
Geocoding API نشانیها و مختصات طول/عرض جغرافیایی را ارائه میدهد.
ایجاد چهار درخواست
تکمیل خودکار - بهازای هر درخواست
بهعلاوه یک فراخوانی Geocoding API
درباره پیشبینی مکان انتخابشده کمتر از هزینه «تکمیل خودکار جا (قدیمی)» بهازای هر جلسه است.۱
برای کمک به کاربران در دریافت پیشبینی موردنظرشان با نویسههای کمتر، روالهای مطلوب عملکرد را بهکار بگیرید.
«تکمیل خودکار جا» مبتنی بر جلسه (قدیمی) برای برنامههای فقط نشانی
از «تکمیل خودکار جا» (قدیمی) مبتنی بر جلسه با «جزئیات جا» (قدیمی) استفاده کنید.
ازآنجاییکه میانگین تعداد درخواستهایی که انتظار دارید قبلاز انتخاب پیشبینی «تکمیل خودکار جا (قدیمی)» توسط کاربر انجام شود از هزینه قیمتگذاری هر جلسه بیشتر است، پیادهسازی شما از «تکمیل خودکار جا (قدیمی)» باید از کد جلسه هم برای درخواستهای «تکمیل خودکار جا (قدیمی)» و هم برای درخواست «جزئیات جا (قدیمی)» مرتبط استفاده کند
هر جلسه.
۱
پیادهسازی ابزاره
مدیریت جلسه بهطور خودکار در ابزارههای
JavaScript،
Android،
یا iOS
ساخته میشود. این شامل درخواستهای «تکمیل خودکار جا (قدیمی)» و درخواست «جزئیات جا (قدیمی)» در پیشبینی انتخابشده میشود. حتماً پارامتر fields را مشخص کنید
تا مطمئن شوید فقط فیلدهای موردنیازتان را درخواست میکنید.
پیادهسازی برنامهای
از
کد جلسه
با درخواستهای «تکمیل خودکار جا» (قدیمی) استفاده کنید.
هنگام درخواست «جزئیات مکان (قدیمی)» درباره پیشبینی انتخابشده،
پارامترهای زیر را اضافه کنید:
- شناسه جا از پاسخ «تکمیل خودکار جا» (قدیمی)
- کد جلسه استفادهشده در درخواست «تکمیل خودکار جا» (قدیمی)
- پارامتر
fieldsکه فیلدهای دادههای پایه مثل نشانی و هندسه را مشخص میکند
بهتأخیر انداختن درخواستهای «تکمیل خودکار جا» (قدیمی) را درنظر بگیرید
میتوانید از استراتژیهایی مانند بهتأخیر انداختن درخواست «تکمیل خودکار جا» (قدیمی) تا زمانی که کاربر سه یا چهار نویسه اول را تایپ کند استفاده کنید تا برنامهتان درخواستهای کمتری ارسال کند. برای مثال، ارسال درخواستهای «تکمیل خودکار جا (قدیمی)» برای هر نویسه پساز اینکه کاربر نویسه سوم را تایپ کرد به این معنی است که اگر کاربر هفت نویسه تایپ کند و سپس پیشبینیای را انتخاب کند که برای آن یک درخواست Geocoding API ارسال میکنید، هزینه کل برای ۴ «تکمیل خودکار جا (قدیمی)» بهازای هر درخواست + Geocoding خواهد بود.۱
اگر با بهتأخیر انداختن درخواستها میتوانید میانگین درخواستهای برنامهای را به کمتر از چهار برسانید، میتوانید از راهنمای پیادهسازی «تکمیل خودکار جا» (قدیمی) با Geocoding API پیروی کنید. توجه داشته باشید که تأخیر در درخواستها میتواند از دید کاربری که ممکن است انتظار داشته باشد با هر کلید جدید پیشبینیها را ببیند، بهعنوان تأخیر درک شود.
روالهای مطلوب عملکرد را بهکار بگیرید تا به کاربران کمک کنید پیشبینی موردنظرشان را با نویسههای کمتری دریافت کنند.
-
برای اطلاع از هزینهها، فهرستهای قیمتگذاری «پلاتفرم Google Maps» را ببینید.
روالهای مطلوب عملکرد
دستورالعملهای زیر روشهای بهینهسازی عملکرد «تکمیل خودکار جا» (قدیمی) را شرح میدهد:
- محدودیتهای کشور، سوگیری مکان، و (برای پیادهسازیهای برنامهای) اولویت زبان را به پیادهسازی «تکمیل خودکار جا» (قدیمی) اضافه کنید. برای ابزارهها به اولویت زبان نیازی نیست چون آنها اولویتهای زبان را از مرورگر یا دستگاه همراه کاربر انتخاب میکنند.
- اگر «تکمیل خودکار جا» (قدیمی) با نقشه همراه باشد، میتوانید مکان را براساس نمای نقشه سوگیری کنید.
- در شرایطی که کاربر یکی از پیشبینیهای «تکمیل خودکار جا (قدیمی)» را انتخاب نمیکند، معمولاً به این دلیل که هیچکدام از آن پیشبینیها نشانی نتیجه موردنظر نیست، میتوانید از ورودی اصلی کاربر دوباره استفاده کنید تا نتایج مرتبطتری دریافت کنید:
- اگر انتظار دارید کاربر فقط اطلاعات نشانی را وارد کند، از ورودی اصلی کاربر در فراخوانی به Geocoding API مجدداً استفاده کنید.
- اگر انتظار دارید کاربر پُرسمانها را برای مکان خاصی براساس نام یا نشانی وارد کند، از درخواست «جزئیات جا (قدیمی)» استفاده کنید. اگر نتایج فقط در منطقه خاصی موردانتظار است، از سوگیری مکان استفاده کنید.
- کاربرانی که نشانیهای فرعی را وارد میکنند، مانند نشانیهای مربوط به واحدها یا آپارتمانهای خاص در یک ساختمان. برای مثال، نشانی چکی «Stroupežnického 3191/17, Praha» پیشبینی جزئی در «تکمیل خودکار جا» (قدیمی) ارائه میدهد.
- کاربرانی که نشانیها را با پیشوندهای بخش جاده وارد میکنند، مانند «23-30 29th St, Queens» در شهر نیویورک یا «47-380 Kamehameha Hwy, Kaneohe» در جزیره کائوآئی در هاوایی.
سوگیری مکانی
با ارسال پارامتر location و پارامتر radius، نتایج را به منطقه مشخصی متمایل کنید. این کار به «تکمیل خودکار جا» (قدیمی) دستور میدهد که نمایش نتایج را در منطقه تعریفشده ترجیح دهد. ممکن است نتایج خارج از منطقه تعریفشده همچنان نمایش داده شود. میتوانید از پارامتر includedRegionCodes برای فیلتر کردن نتایج استفاده کنید
تا فقط مکانهای داخل کشور مشخصشده نشان داده شود.
محدود کردن مکان
با ارسال پارامتر locationRestriction، نتایج را به منطقه مشخصی محدود کنید.
همچنین میتوانید با افزودن پارامتر
strictbounds
، نتایج را به منطقهای که با location
و پارامتر radius تعریف شده است محدود کنید. این کار به «تکمیل خودکار جا» (قدیمی) دستور میدهد فقط
نتایج درون آن منطقه را برگرداند.
عیبیابی
اگرچه ممکن است خطاهای بسیار متنوعی رخ دهد، اکثر خطاهایی که احتمالاً برنامهتان تجربه میکند معمولاً بهدلیل خطاهای پیکربندی (برای مثال، استفاده از کلید میانای برنامهسازی کاربردی اشتباه یا پیکربندی نادرست کلید میانای برنامهسازی کاربردی) یا خطاهای سهمیه (برنامهتان از سهمیه خود فراتر رفته است) ایجاد میشوند. برای اطلاعات بیشتر درباره سهمیهها، به حدود استفاده مراجعه کنید.
خطاهایی که در استفاده از کنترلهای تکمیل خودکار رخ میدهد در روش didFailAutocompleteWithError() پروتکلهای مختلف نماینده برگردانده میشود. ویژگی
code شیء NSError ارائهشده روی یکی از مقادیر
شمارش GMSPlacesErrorCode تنظیم شده است.