将 unwind segue 与 UISearchController 一起使用时出错

Posted

技术标签:

【中文标题】将 unwind segue 与 UISearchController 一起使用时出错【英文标题】:Error when using unwind segue with UISearchController 【发布时间】:2016-10-12 15:21:19 【问题描述】:

我有一个带有 UITableViewController 的导航控制器。

当用户在 TableViewController 上选择一个单元格时,它会推送到一个新的 View Controller,其中包含一个 Table View。然后用户选择一个单元格,数据通过展开转场传回。

问题是在选择单元格之前使用搜索栏时出现此错误。这是控制台的内容:

popToViewController:transition: called on <UINavigationController 0x7fc8ab856e00> while an existing transition or presentation is occurring; the navigation stack will not be updated.

来自视图控制器的代码我正在展开来自

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
        let cell = tableView.cellForRow(at: indexPath) as! MonsterSpriteCell
        let monster = monsters[indexPath.row]
        selectedMonster = monster
        if isTeamBuilding 
            // **ERROR OCCURS HERE**
            performSegue(withIdentifier: "saveToTeamBuilderTableVC", sender: cell)
         else 
            performSegue(withIdentifier: "showMonsterDetail", sender: self)
        
    

这里是项目的链接。我要展开的视图控制器是浏览视图控制器。我要放松的视图控制器是 TeamBuilderViewController https://github.com/emanleet/monsterpedia

编辑:我认为可能需要注意的是,segue 展开到 TeamBuilderTableViewController,它是一个视图控制器,它位于容器内,作为另一个视图控制器的一部分。有谁知道这是否是我的 unwind segue 不起作用的原因?

【问题讨论】:

【参考方案1】:

SearchController 呈现一个空视图控制器 如果您在搜索处于活动状态时在didSelectRow.. 中打印presentedViewController,您将看到一个视图控制器。 这意味着您正在尝试从当前演示文稿下执行 segue。在执行任何 segues 或演示之前,您应该关闭 SearchController

同样在这种情况下,您不需要 SearchController,因为您只使用 SearchBar 进行过滤。 相反,在tableViewHeaderView 中放置一个SearchBar 并使用它的委托进行过滤,而不是检查isActive 是否访问完整列表与过滤结果,只需将整个数组放在过滤器中当文本被清除并始终访问过滤后的结果。

【讨论】:

【参考方案2】:

两步,首先关闭搜索控制器呈现的视图控制器,然后,做你的事。

yourSearchController.dismiss(animated: true, completion:  
                self.performSegue(withIdentifier: "yourUnwindSegue", sender: self)
            )

【讨论】:

以上是关于将 unwind segue 与 UISearchController 一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 unwind segues 通过 UITableViewcell 推送数据

UINavigationController 的 Unwind Segue

如何以编程方式执行Unwind segue?

从 Unwind segue 触发时,Push segue 不起作用

不同的 Unwind Segue 取决于来源

unwind segue和delegation的区别