将 unwind segue 与 UISearchController 一起使用时出错
Error when using unwind segue with UISearchController
我有一个带有 UITableViewController 的导航控制器。
当用户在 TableViewController 上选择一个单元格时,它会推送到一个新的视图控制器,其中包含一个 Table 视图。然后用户选择一个单元格,数据通过展开转场传回。
问题是我在选择单元格之前使用搜索栏时遇到此错误。这是控制台显示的内容:
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)
}
}
这里是 link 项目。我正在展开的视图控制器是浏览视图控制器。我正在使用的视图控制器是 TeamBuilderViewController
https://github.com/emanleet/monsterpedia
编辑:我认为可能需要注意 segue 展开到 TeamBuilderTableViewController,这是一个视图控制器,作为另一个视图控制器的一部分位于容器内。有谁知道这是否是我的 unwind segue 不起作用的原因?
SearchController 正在呈现一个空视图控制器
如果在搜索处于活动状态时在 didSelectRow..
中打印 presentedViewController
,您将看到一个视图控制器。
这意味着您正在尝试从当前演示文稿下执行 segue。在执行任何转场或演示之前,您应该关闭 SearchController
。
此外,在这种情况下,您不需要 SearchController
,因为您仅使用 SearchBar
进行过滤。
相反,将 SearchBar
放在 tableViewHeaderView
中并使用其委托进行过滤,而不是检查 isActive
是否访问完整列表与过滤结果,只需将整个数组在清除文本时在过滤器中并始终访问过滤后的结果。
两步操作,首先关闭搜索控制器呈现的视图控制器,然后执行您的操作。
yourSearchController.dismiss(animated: true, completion: {
self.performSegue(withIdentifier: "yourUnwindSegue", sender: self)
})
我有一个带有 UITableViewController 的导航控制器。
当用户在 TableViewController 上选择一个单元格时,它会推送到一个新的视图控制器,其中包含一个 Table 视图。然后用户选择一个单元格,数据通过展开转场传回。
问题是我在选择单元格之前使用搜索栏时遇到此错误。这是控制台显示的内容:
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)
}
}
这里是 link 项目。我正在展开的视图控制器是浏览视图控制器。我正在使用的视图控制器是 TeamBuilderViewController https://github.com/emanleet/monsterpedia
编辑:我认为可能需要注意 segue 展开到 TeamBuilderTableViewController,这是一个视图控制器,作为另一个视图控制器的一部分位于容器内。有谁知道这是否是我的 unwind segue 不起作用的原因?
SearchController 正在呈现一个空视图控制器
如果在搜索处于活动状态时在 didSelectRow..
中打印 presentedViewController
,您将看到一个视图控制器。
这意味着您正在尝试从当前演示文稿下执行 segue。在执行任何转场或演示之前,您应该关闭 SearchController
。
此外,在这种情况下,您不需要 SearchController
,因为您仅使用 SearchBar
进行过滤。
相反,将 SearchBar
放在 tableViewHeaderView
中并使用其委托进行过滤,而不是检查 isActive
是否访问完整列表与过滤结果,只需将整个数组在清除文本时在过滤器中并始终访问过滤后的结果。
两步操作,首先关闭搜索控制器呈现的视图控制器,然后执行您的操作。
yourSearchController.dismiss(animated: true, completion: {
self.performSegue(withIdentifier: "yourUnwindSegue", sender: self)
})