呈现视图控制器并添加子视图控制器导致应用程序冻结

Posted

技术标签:

【中文标题】呈现视图控制器并添加子视图控制器导致应用程序冻结【英文标题】:Present View Controller and Add Child View Controller Cause App Freeze 【发布时间】:2017-07-11 15:20:21 【问题描述】:

我有AViewController。在A 内部,我有一个MapViewController 实例。 MapViewControllerA 的子视图控制器。

现在当A 中的按钮获得TouchUpInside 时,我会初始化BViewController。并呈现B

当初始化BViewController 时,我将MapViewController 传递给B 并作为无主变量存储在B 中。

我需要为AB 显示相同的地图。在BviewDidLoad 中,我添加MapViewController 作为B 的子视图控制器。

当我按下按钮时,应用程序冻结。没有异常,没有崩溃,没有错误日志。

有人知道为什么会这样吗?


我的尝试:

    我尝试使用导航控制器并使用 pushViewController 方法,结果相同,应用冻结 我尝试将 MapViewController 添加为 B ViewWillAppear 中的子级,结果相同,应用程序冻结 我尝试在B ViewDidAppear 中添加MapViewController 作为孩子,不再冻结,但地图根本不存在。 我尝试将 B 添加为 A 的 childViewController 而不是现在的 B,结果相同,应用程序冻结 我检查了关于在主线程上运行的所有指令。 在出现 B 之前,我尝试在 A 中将 mapViewController 作为子级删除,结果相同,应用程序冻结。 当存在B 时,我尝试将mapViewController 作为子项添加到完成块中,结果相同,应用程序冻结

【问题讨论】:

你有没有尝试推送 B viewController 来代替? 你真的需要介绍一个新的 VC 吗?如果你想在B 中显示相同的“地图”,也许你只需更改 A 中的元素而不是加载一个全新的 ViewController 会更好。 @ArthurSahakyan 是的,我做到了。同样的结果,应用程序冻结。 @DonMag 感谢您的建议。这绝对是一个解决方案。但我确实想了解为什么会出现这个问题。使用B 还可以将代码变成小模块,使代码更具可读性。 Present B 还让用户知道他们正在使用新功能。 当你说你 “需要为AB 显示相同的地图” ...你是否真的试图MapViewController 实例从A 移动B? 【参考方案1】:

这可能是一个更好的结构。当您从A 内容切换到B 内容时,您可以随意移动/调整元素的大小......而且由于它们将是您的“主”视图的单独子视图,如果您的界面将从中受益,它们可以重叠那个布局:

【讨论】:

以上是关于呈现视图控制器并添加子视图控制器导致应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章

如何将视图添加为某些控制器的子视图

将视图控制器添加到我的视图并编程冻结。目标-c

关闭模式视图控制器偶尔冻结应用程序,swift 3

是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?

UIPageViewController - 添加的子视图会导致第一个控制器视图中的错误 - 其他控制器很好

关闭呈现的 VC 时呈现视图控制器会丢失子视图