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

کنترل واسط کاربر تکمیل خودکار کادر گفتگوی جستجویی با عملکرد تکمیل خودکار داخلی است. وقتی کاربر عبارتهای جستجو را وارد میکند، کنترل فهرستی از مکانهای پیشبینیشده را برای انتخاب ارائه میدهد. وقتی کاربر انتخابی انجام میدهد، یک نمونه
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 protocol داخلی 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/محدودیت که نتایج را به منطقه خاصی که با مرزهای عرض و طول جغرافیایی مشخص شده است، متمایل میکند.
- روش فراخوانی برای رسیدگی به پیشبینیهای برگشتی.
نمونه کدهای زیر فراخوانی 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 این اطلاعات را با هزینه کمتری نسبتبه فراخوانی Place Details (Legacy) ارائه میدهد.
- اگر کاربران پیشبینی تکمیل خودکار را در میانگین چهار درخواست پیشبینی «تکمیل خودکار مکان» (قدیمی) یا کمتر انتخاب کنند، قیمتگذاری بهازای هر درخواست میتواند مقرونبهصرفهتر از قیمتگذاری بهازای هر جلسه باشد.
آیا برنامه شما به اطلاعات دیگری غیراز نشانی و طول/عرض جغرافیایی پیشبینی انتخابی نیاز دارد؟
بله، به جزئیات بیشتری نیاز است
استفاده از «تکمیل خودکار جا» مبتنی بر جلسه (قدیمی) با «جزئیات جا» (قدیمی).
ازآنجاییکه برنامه شما به «جزئیات مکان (قدیمی)» نیاز دارد، مثل نام مکان، وضعیت کسبوکار،
یا ساعت کاری، پیادهسازی شما از «تکمیل خودکار جا (قدیمی)» باید از کد جلسه استفاده کند
(بهصورت برنامهنویسیشده یا تعبیهشده در
ابزارههای JavaScript،
Android،
یا iOS)
بهازای هر جلسه
بهعلاوه شناسههای محصول دادههای Places قابلاجرا،
بسته به اینکه کدام فیلدهای داده مکان را درخواست میکنید.۱
پیادهسازی ابزاره
مدیریت جلسه بهطور خودکار در
JavaScript،
Android،
یا iOS
ابزارهها ساخته میشود. این شامل هر دو درخواست «تکمیل خودکار مکان (قدیمی)» و درخواست «جزئیات مکان (قدیمی)»
در پیشبینی انتخابشده میشود. حتماً پارامتر fields را مشخص کنید تا مطمئن شوید فقط
فیلدهای داده تکمیل خودکار مکان (قدیمی)
موردنیازتان را درخواست میکنید.
پیادهسازی برنامهریزیشده
از
نشانه جلسه
با درخواستهای «تکمیل خودکار مکان (قدیمی)» استفاده کنید. هنگام درخواست «جزئیات مکان» (قدیمی) درباره پیشبینی انتخابشده، پارامترهای زیر را اضافه کنید:
- شناسه مکان از پاسخ «تکمیل خودکار مکان» (قدیمی)
- نشانه جلسه استفادهشده در درخواست «تکمیل خودکار مکان» (قدیمی)
- پارامتر
fieldsکه فیلدهای داده تکمیل خودکار مکان (قدیمی) موردنیاز شما را مشخص میکند
نه، فقط به نشانی و مکان نیاز دارد
بسته به عملکرد استفاده شما از Place Autocomplete (Legacy)، Geocoding API میتواند گزینه مقرونبهصرفهتری نسبتبه Place Details (Legacy) برای برنامه شما باشد. کارایی «تکمیل خودکار مکان» (قدیمی) هر برنامه بسته به آنچه کاربران وارد میکنند، جایی که برنامه استفاده میشود، و اینکه آیا روالهای مطلوب بهینهسازی عملکرد اجرا شدهاند یا نه متفاوت است.
برای پاسخ دادن به سؤال زیر، تجزیهوتحلیل کنید که کاربر بهطور میانگین چند نویسه تایپ میکند تا پیشبینی «تکمیل خودکار مکان» (قدیمی) را در برنامهتان انتخاب کند.
آیا کاربران شما بهطور میانگین در چهار درخواست یا کمتر، پیشبینی «تکمیل خودکار مکان» (قدیمی) را انتخاب میکنند؟
بله
برنامه «تکمیل خودکار مکان» (قدیمی) را بدون نشانهای جلسه بهصورت برنامهنویسی پیادهسازی کنید و «میانای برنامهسازی کاربردی Geocoding» را در پیشبینی مکان انتخابشده فراخوانی کنید.
Geocoding API نشانیها و مختصات طول/عرض جغرافیایی را ارائه میدهد.
انجام چهار درخواست
تکمیل خودکار - براساس درخواست
بهعلاوه یک فراخوانی میانای برنامهسازی کاربردی زمینکدیابی
درباره پیشبینی مکان انتخابی کمتر از هزینه هر جلسه «تکمیل خودکار مکان» (قدیمی)
در هر جلسه است.۱
برای کمک به کاربران در دریافت پیشبینی موردنظرشان با تعداد نویسههای کمتر، از بهترین روشهای عملکرد استفاده کنید.
نه
از «تکمیل خودکار جا» (قدیمی) مبتنی بر جلسه با «جزئیات جا» (قدیمی) استفاده کنید.
ازآنجاییکه تعداد میانگین درخواستهایی که انتظار دارید قبلاز انتخاب پیشبینی
«تکمیل خودکار مکان» (قدیمی) توسط کاربر انجام دهید از هزینه قیمتگذاری بهازای هر جلسه فراتر میرود، پیادهسازی
«تکمیل خودکار مکان» (قدیمی) شما باید برای هر دو درخواست «تکمیل خودکار مکان» (قدیمی)
و درخواست «جزئیات مکان» (قدیمی) مرتبط از
کد جلسه استفاده کند.
۱
پیادهسازی ابزاره
مدیریت جلسه بهطور خودکار در ابزارههای
JavaScript،
Android،
یا iOS
ساخته میشود. این شامل هر دو درخواست «تکمیل خودکار مکان» (قدیمی) و درخواست «جزئیات مکان» (قدیمی)
در پیشبینی انتخابشده میشود. حتماً پارامتر fields را مشخص کنید
تا مطمئن شوید فقط فیلدهایی را که نیاز دارید درخواست میکنید.
پیادهسازی برنامهریزیشده
از
نشانه جلسه
با درخواستهای «تکمیل خودکار مکان (قدیمی)» استفاده کنید.
هنگام درخواست «جزئیات مکان» (قدیمی) درباره پیشبینی انتخابشده،
پارامترهای زیر را اضافه کنید:
- شناسه مکان از پاسخ «تکمیل خودکار مکان» (قدیمی)
- نشانه جلسه استفادهشده در درخواست «تکمیل خودکار مکان» (قدیمی)
- پارامتر
fieldsکه فیلدهای دادههای پایه مثل نشانی و هندسه را مشخص میکند
درنظر بگیرید درخواستهای «تکمیل خودکار مکان» (قدیمی) را بهتأخیر بیندازید
میتوانید از استراتژیهایی مثل بهتأخیر انداختن درخواست «تکمیل خودکار مکان» (قدیمی) تا زمانی که کاربر سه یا چهار نویسه اول را تایپ کند استفاده کنید تا برنامهتان درخواستهای کمتری ارسال کند. برای مثال، درخواستهای «تکمیل خودکار مکان (قدیمی)» برای هر نویسه پساز اینکه کاربر نویسه سوم را تایپ کرد به این معنی است که اگر کاربر هفت نویسه تایپ کند و پیشبینیای را انتخاب کند که برای آن یک درخواست Geocoding API انجام دهید، هزینه کل برای ۴ درخواست «تکمیل خودکار مکان (قدیمی)» در هر درخواست + Geocoding خواهد بود.۱
اگر با بهتأخیر انداختن درخواستها بتوانید میانگین درخواستهای برنامهریزیشدهتان را به کمتر از چهار برسانید، میتوانید از راهنماییهای مربوط به پیادهسازی «تکمیل خودکار مکان» کارآمد (قدیمی) با «ایپیآی زمینکدی» پیروی کنید. توجه داشته باشید که تأخیر در درخواستها میتواند ازسوی کاربر بهعنوان تأخیر درک شود، زیرا ممکن است کاربر انتظار داشته باشد با هر ضربه کلید جدید، پیشبینیها را ببیند.
برای کمک به کاربران در دریافت پیشبینی موردنظرشان با نویسههای کمتر، روشهای مطلوب عملکرد را بهکار بگیرید.
-
برای اطلاع از هزینهها، فهرست قیمتهای «پلاتفرم 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 محدود کنید. این دستور به «تکمیل خودکار مکان» (قدیمی) میگوید که فقط
نتایج را در آن منطقه برگرداند.
عیبیابی
اگرچه ممکن است انواع مختلفی از خطاها رخ دهد، اما اکثر خطاهایی که احتمالاً برنامه شما با آنها مواجه میشود معمولاً ناشی از خطاهای پیکربندی (برای مثال، استفاده از کلید API اشتباه یا پیکربندی نادرست کلید API) یا خطاهای سهمیه (برنامه شما از سهمیه خود فراتر رفته است) است. برای اطلاعات بیشتر درباره سهمیهها، حدود استفاده را ببینید.
خطاهایی که در استفاده از کنترلهای تکمیل خودکار رخ میدهند در روش
didFailAutocompleteWithError() پروتکلهای نماینده مختلف برگردانده میشوند. دارایی
code شیء NSError ارائهشده روی یکی از مقادیر
شمارش GMSPlacesErrorCode تنظیم شده است.