Представление UIAlertController, когда UISearchController активен

У меня есть UITableView с UISearchController на панели навигации. Содержимое табличного представления обновляется по мере того, как пользователь вводит текст в строку поиска. Когда строка выбрана, другой контроллер табличного представления помещается в стек навигации. На этом новом контроллере табличного представления есть элемент кнопки панели, который представляет лист действий. Проблема в том, что когда я выбираю строку после использования контроллера поиска, а затем пытаюсь открыть лист действий на новом контроллере табличного представления, я получаю

Attempt to present <UIAlertController: 0x103971800>  on <KYFB_Black_Book.MembersTableViewController: 0x103854c00> which is already presenting (null)

Если я выбираю строку из первого контроллера без поиска, а затем открываю лист действий на втором контроллере, все работает нормально.

В viewDidLoad() первого контроллера:

searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.searchBar.tintColor = .white
        searchController.dimsBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = false
        let searchField = searchController.searchBar.value(forKey: "searchField") as? UITextField
        searchField?.textColor = .white

        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = false
        } else {
            searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 200.0, height: 44.0)
            searchField?.textColor = .black
            searchController.searchBar.tintColor = .black
            navigationItem.titleView = searchController.searchBar
        }

Обновление результатов на основе текста поиска:

@available(iOS 8.0, *)
    func updateSearchResults(for searchController: UISearchController) {
        filteredCountyNames.removeAll(keepingCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (countyNames as NSArray).filtered(using: searchPredicate)
        filteredCountyNames = array as! [String]
        tableView.reloadData()
    }

Во втором контроллере, представляя контроллер предупреждений:

@objc func actionTapped() {
        let emailAlert = UIAlertController(title: "Contact All Committee Members", message: "", preferredStyle: .actionSheet)
        let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) in
            print("Cancel")
            })
        let emailAction = UIAlertAction(title: "Email", style: .default, handler: { (action) in
            self.emailAll()
            })
        let messageAction = UIAlertAction(title: "Text Message", style: .default, handler: { (action) in
            self.textAll()
            })

        emailAlert.view.tintColor = UIColor(red: 28.0 / 255.0, green: 75.0 / 255.0, blue: 136.0 / 255.0, alpha: 1)
        emailAlert.addAction(emailAction)
        emailAlert.addAction(messageAction)
        emailAlert.addAction(cancelAction)
        present(emailAlert, animated: true, completion: nil)
    }

person raginggoat    schedule 25.08.2017    source источник
comment
Я думаю, что проблема связана со свойством definesPresentationContext   -  person Reinier Melian    schedule 25.08.2017
comment
@ReinierMelian Я попытался установить значение true, но получил тот же результат.   -  person raginggoat    schedule 25.08.2017
comment
@raginggoat Похоже, что MembersTableViewController представил что-то перед представлением листа действий. Вы уверены, что вам ничего не подарили?   -  person HMHero    schedule 25.08.2017


Ответы (2)


Можете ли вы попробовать это, чтобы увидеть, работает ли это? Просто замените последнюю строку вашего кода, где вы представляете лист действий.

if let presentedVC = presentedViewController {
    presentedVC.present(emailAlert, animated: true, completion: nil)
} else {
    present(emailAlert, animated: true, completion: nil)
}
person HMHero    schedule 25.08.2017

У меня была такая же ошибка при использовании UISearchController и попытке представить UIAlertController. Попробуй это:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // To avoid the problem
        search.dismiss(animated: false, completion: nil)
    }
person Jaime Bocio    schedule 11.01.2018
comment
Я не хочу отклонять searchBar перед открытием UIAlearView, просто показываю его, даже если searchBar виден! - person user924; 13.05.2019