Показать последовательность (программно) при выборе места из GMSAutocompleteResultsViewController
У меня возникли некоторые проблемы с переходом на новый viewcontroller через show segue. Я был в состоянии использовать настоящий переход, но хочу использовать стек навигации push / show. Я получаю эту ошибку... "происходит существующий переход или презентация; стек навигации не будет обновлен". Спасибо за любую помощь заранее!
// перейти к поиску ВК от homecontroller
func handleSearch() {
let vc = SearchVC()
show(vc, sender: self)
}
// настройка панели поиска в классе searchVC
func loadPlacesSearchBar() {
searchController?.searchBar.isHidden = false
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
searchController?.searchBar.placeholder = "search places"
// 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
}
// расширение из SearchVC
extension SearchVC: GMSAutocompleteResultsViewControllerDelegate {
func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
didAutocompleteWith place: GMSPlace) {
searchController?.isActive = false
// Do something with the selected place.
let autocompleteController = GMSAutocompleteViewController()
autocompleteController.delegate = self as? GMSAutocompleteViewControllerDelegate
print("Place name: \(place.name)")
print("Place address: \(String(describing: place.formattedAddress))")
print("Place attributions: \(String(describing: place.attributions))")
self.dismiss(animated: true, completion: nil)
let mapView = MapViewController()
show(mapView, sender: self)
// let mapView = MapViewController()
// let navController = UINavigationController(rootViewController: mapView)
// present(navController, animated: true, completion: nil)
DispatchQueue.main.async {
self.dismiss(animated: true, completion: nil)
}
}
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
}
}
1 ответ
Причина, по которой вы сталкиваетесь с этим, заключается в том, что searchController
будет отклонен, когда вы сделаете свой выбор, и, таким образом, окажетесь в середине анимации, когда вы пытаетесь нажать этот новый контроллер представления.
Очень простое решение, которое работает для меня, - это настроить ваш контроллер вида как UISearchControllerDelegate
, а затем вызывая ваш переход после searchController
был уволен.
searchController = UISearchController(searchResultsController: resultsViewController)
searchController?.searchResultsUpdater = resultsViewController
searchController?.delegate = self //<- add this
Затем согласитесь с делегатом и выполните это
extension YourViewController:UISearchControllerDelegate {
func didDismissSearchController(_ searchController: UISearchController) {
// perform your segue, or push/present your view controller here
}