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

Posted

技术标签:

【中文标题】当 UISearchController 处于活动状态时呈现 UIAlertController【英文标题】:Presenting UIAlertController when UISearchController is Active 【发布时间】:2017-08-25 15:34:08 【问题描述】:

我有一个 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)
    

【问题讨论】:

我认为这个问题与definesPresentationContext属性有关 @ReinierMelian 我尝试将其设置为 true 但得到相同的结果。 @raginggoat 似乎 MemberTableViewController 在展示操作表之前展示了一些东西。你确定你没有任何礼物吗? 【参考方案1】:

你可以试试这个看看它是否有效?只需替换显示操作表的代码的最后一行即可。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我不想在打开 UIAlearView 之前关闭 searchBar,即使 searchBar 可见也只显示它!

以上是关于当 UISearchController 处于活动状态时呈现 UIAlertController的主要内容,如果未能解决你的问题,请参考以下文章

当 UISearchController 处于活动状态并选择新选项卡时,UITableView 消失

当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失

在 UISearchController 处于活动状态时选择 tableview 中的单元格,不显示下一个视图?

当搜索栏处于活动状态时,快速表视图被锁定

UISearchController 不会停留在表头视图的顶部

带有大标题的 UISearchController 在选项卡栏中崩溃,“只有一个带有顶部边界的调色板可以在过渡之外处于活动状态”