当UISearchController处于活动状态时呈现UIAlertController

时间:2017-08-25 15:34:08

标签: ios swift 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)
    }

2 个答案:

答案 0 :(得分:6)

你能试试看看它是否有效吗?只需替换显示操作表的代码的最后一行。

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

答案 1 :(得分:2)

当使用UISearchController并尝试呈现UIAlertController时,我遇到了同样的错误。试试这个:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // To avoid the problem
        search.dismiss(animated: false, completion: nil)
    }