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

Posted

技术标签:

【中文标题】警告:尝试在已呈现 <UISearchController: 0x142a1f7c0> 的 * 上呈现视图控制器【英文标题】:Warning: Attempt to present View Controller on * which is already presenting <UISearchController: 0x142a1f7c0> 【发布时间】:2016-04-19 23:10:18 【问题描述】:

我用 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)
        
    

【问题讨论】:

可能你必须通过 UISearchController 呈现它。 self.searchController presentViewController...? 我刚刚用将单元格链接到视图控制器的函数代码更新了问题。 @EmptyStack 我不认为我完全明白你的意思。你能解释一下吗?感谢您的回答。 您是否尝试过使用 segue 而不是实例化视图控制器?你可以调用'performSegueWithIdentifier("segueID")' 【参考方案1】:

我遇到了同样的警告,这为我解决了问题。您需要停止显示搜索控制器,以便在离开视图时显示其他控制器。

         override func viewDidDisappear(_ animated: Bool) 

                if SearchController.isActive == true 

                          SearchController.isActive = false

                 
           

【讨论】:

【参考方案2】:

我正在解决同样的原始问题,但这些都没有为我解决。

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

所以,当你想启动你的动作时,你只需要调用这个:

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

希望这会有所帮助!

【讨论】:

【参考方案3】:

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

从 viewDidDisappear() 中解散也无法正常工作。以下是我的做法。

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

//Do some stuff here

   if searchController.isActive

        searchController.isActive = false

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


【讨论】:

【参考方案4】:

解除 UISearchController(在这个线程中以十几种不同的方式提出)是一个可行的解决方案。我发现的另一种解决方法就是拥有

definesPresentationContext = true 

在具有 UISearchController 的视图控制器的 viewDidLoad() 中。这种解决方法在某种程度上更好,一旦您导航回来,UISearchController 仍会显示搜索结果。

【讨论】:

【参考方案5】:

没有代码很难帮助您。该错误可能是因为您破坏了视图控制器层次结构。

消息是说您涉及 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)

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

更多信息您可以查看:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/TheViewControllerHierarchy.html#//apple_ref/doc/uid/TP40007457-CH33-SW1

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

【讨论】:

感谢您的回答。我刚刚用将单元格链接到视图控制器的函数的代码更新了这个问题。关于没有大写字母的“ProfileView”,你完全正确,我没有写。由于某种原因我没有注意到它,我现在将其更改。谢谢。 另外,我不明白为什么其中一种有效而另一种无效,如果是这种情况,这两种类型都应该无效吗? 这里发生了一件棘手的事情。您的一个 vc(有效的)在呈现时没有动画,而另一个则没有。也许呈现的视图控制器在没有动画时会立即关闭,这就是您没有收到警告的原因。 来自 Apple 文档:要自定义搜索结果控制器的显示或关闭,请将对象分配给搜索控制器的委托属性。委托对象必须符合 UISearchControllerDelegate 协议。当搜索控制器本身被激活以及搜索结果控制器出现或关闭时,您可以使用该协议的方法得到通知。 不幸的是,我只将 UISearchController 用于搜索栏。我没有真正以正确的方式使用它,因为我遇到了一些更大的问题。但是,我发现只有在尚未选择搜索控制器时,组的链接才有效。因此,当我专注于搜索栏并且范围按钮出现时,它就不再起作用了。【参考方案6】:

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

    self.searchController.dismiss(animated: false)  
        self.performSegue(withIdentifier: "<YOUR SEGUE IDENTIFIER>", sender: cell)
    

【讨论】:

以上是关于警告:尝试在已呈现 <UISearchController: 0x142a1f7c0> 的 * 上呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

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

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

在已卸载的组件中发出有关setState的警告

Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *

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

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