警告:尝试在已呈现的*上显示View Controller

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了警告:尝试在已呈现的*上显示View Controller相关的知识,希望对你有一定的参考价值。

我用UISearchControllerUITableView做了一个视图控制器。您可以从搜索范围按钮中选择两种不同类型的搜索:组和人员。两种搜索都可以在桌面上显示并显示结果。但是,如果单击每个单元格,则应将它们定向到不同的动态页面(动态组页面或动态人员配置文件页面)。用于组的工作,而用于配置文件的工作则不工作。这意味着每当我从我得到的结果中点击一个人单元格时,没有任何反应,我在控制台上打印出以下警告:

Warning: Attempt to present <MyProject.profileView: 0x13e9df000>  on <MyProject.SearchPage: 0x142a1d8f0> which is already presenting <UISearchController: 0x142a1f7c0>

如果您知道为什么会发生这种情况,如果您能告诉我,我们将非常感激。

编辑:这是应该将单元格链接到不同视图控制器的功能:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        if self.searchForGroups {

            let detailCell:PFObject = self.filteredGroups.objectAtIndex(indexPath.row) as! PFObject

            let vc = self.storyboard!.instantiateViewControllerWithIdentifier("DynamicCellView") as! DynamicCellView

            vc.GroupId = detailCell.objectId!

            self.presentViewController(vc, animated: false, completion: nil)

        }else{
            //Link to use profile
            let user = self.peopleResults[indexPath.row]
            let vc = self.storyboard!.instantiateViewControllerWithIdentifier("ProfileView") as! profileView
            vc.profileId = user.objectId!
            self.presentViewController(vc, animated: true, completion: nil)
        }
    }
答案

我有同样的警告,这为我修好了。您需要停止显示搜索控制器,以便在离开视图时显示其他控制器。

         override func viewDidDisappear(_ animated: Bool) {

                if SearchController.isActive == true {

                          SearchController.isActive = false

                 }
          } 
另一答案

我正在想出同样的原始问题,但没有一个能解决它。

实际上你只需要解雇UISearchController,因为它已经呈现给当前视图。

因此,当您想要启动操作时,您只需要调用它:

if searchController.isActive {
    self.searchController.dismiss(animated: false) { 
        // Do what you want here like perform segue or present
    }
}

希望这会有所帮助!

另一答案

没有代码有点难以帮助你。可能会发生该错误,因为您正在破坏视图控制器层次结构。

消息是说您有3个视图控制器:

 SearchPage is presenting UISearchController

 profileView is not yet presented but should be presented on UISearchController or should replace it (For that UISearchController should be dismissed first)

请记住,视图控制器当时只能显示1个视图控制器,但它可以有多个子视图控制器(例如导航控制器)。

有关更多信息,请查看:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/TheViewControllerHierarchy.html#//apple_ref/doc/uid/TP40007457-CH33-SW1

就像评论一样,它是一个很好的编码实践,用大写字母('ProfileView'而不是'profileView')开始你的类名

另一答案

在点击搜索结果时尝试执行segue时遇到了同样的错误。这不是一个理想的解决方法,但在执行segue之前解雇searchController为我修复了它:

    self.searchController.dismiss(animated: false) { 
        self.performSegue(withIdentifier: "<YOUR SEGUE IDENTIFIER>", sender: cell)
    }
另一答案

我不确定上述答案是否在之前的版本中正常工作,但在swift 5中,调用dismiss将导致segue正确触发,但搜索栏将保持活动状态,并且当他们解除触发的segue时(返回搜索页面)搜索栏看起来是活动的,但结果不会。

同样从viewDidDisappear()中解雇也无法正常工作。这就是我做到的。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

//Do some stuff here

   if searchController.isActive{

        searchController.isActive = false

    }
    performSegue(withIdentifier: "<yourSegueIdentifierHere>", sender: nil)

}

以上是关于警告:尝试在已呈现的*上显示View Controller的主要内容,如果未能解决你的问题,请参考以下文章

警告:尝试在已呈现 <RCTModalHostViewController> 的 <RNNsideMenuController> 上呈现 <UINavigationCon

警告:尝试在已呈现 <UISearchController: 0x142a1f7c0> 的 * 上呈现视图控制器

警告:尝试在已经呈现的 MainTableViewController 上呈现 ModalTableViewController (null)

警告:尝试在其视图不在窗口层次结构中的 * 上呈现 * - swift

警告:尝试在视图不在窗口层次结构中的 **.ViewController 上呈现 ZMNavigationController

警告:尝试在其视图不在窗口层次结构中的 ViewController 上呈现 ViewController (w/UIAlertController)