Показать последовательность (программно) при выборе места из 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
}
Другие вопросы по тегам