打开和关闭 UINavigationController
Posted
技术标签:
【中文标题】打开和关闭 UINavigationController【英文标题】:Opening and closing UINavigationController 【发布时间】:2016-09-26 15:02:26 【问题描述】:我知道它可能已经在某处写过有关此问题的文章,但我找不到解决方案并且已经解决了几天。
我有一个带有 4 个 UINavigationControllers 的 UITabbar 应用程序。 在其中一个 UINavigationController 上,有一个 UIViewController 带有一个按钮,该按钮通过模态转换打开另一个 UINavigationController。打开后一切正常,但在使用代码从其 UIViewController 关闭最后一个 NC 后:
self.dismiss(animated: false, completion: nil)
或
self.navigationController?.dismiss(animated: false, completion: nil)
我遇到了问题。 无论我接下来做什么,我都会收到警告不平衡调用开始/结束外观转换,并且不会调用 UIViewControllers 方法 viewWillAppear 和 viewDidAppear。但为了清楚起见,我只有在打开新视图时才会遇到这个问题,如果我只是在选项卡之间切换到其他 UINavigationViewController 也会遇到这个问题。
我已经检查了我读到的一种可能性,并且我确定我不会打开一件事两次。
我只是不知道是多个 NavigationControllers 的问题还是我关闭它的方式或什么。
任何建议都会有所帮助。
编辑1:
忘了说,UINavigationController 是通过模态序列打开的,而不是通过代码打开的。
所有 NC 至少有一个 VC(所有 4 个在标签栏上,还有一个稍后打开)
EDIT2:
关闭 VC 的代码在上次打开的 NC(不是选项卡栏 NC 之一)上的最后打开的 VC 上运行,以返回到选项卡栏 NC/他的 VC 之一。 为了确保我会再写一遍
TC -> NC NC NC NC
| | | |
VC VC VC VC
|
NC
|
VC - the one that calls dismiss to return to previous VC
这太令人沮丧了,直到我打开另一个 UINavigationController 一切正常,但在那之后问题就开始了。或者添加我注意到的另一件事,在模态呈现另一个控制器后出现问题,它是 UINavigation 还是普通 ViewController 都没关系。
EDIT3:
感谢@kgkoutio,问题解决了,我犯的错误是我没有在某处调用 super.viewDidLoad 和 super.viewWillAppear。将其添加到所有 VC 后,问题就消失了。
再次感谢@kgkoutio
【问题讨论】:
【参考方案1】:您的代码忽略了 NC 而不是 VC。当应用程序启动时,TabBar 会使用您的导航控制器集进行初始化。考虑关闭 UIViewController 而不是 NC:
self.navigationController.topViewController?.dismiss(animated: false, completion: nil)
【讨论】:
不幸的是仍然是警告,但感谢您的建议,还是您认为我应该先解雇 VC,然后再解雇 NC?而且所有的NC都至少有一个VC 一旦你解散了 NC,VC 就会被解散。但是,创建后的 UITabBar 具有一个包含所有视图控制器(在您的情况下为导航控制器)的集合。一旦你解雇了一个,它将为零,所以我猜系统无法运行任何 VC 功能。您可能需要分享更多关于您在何处运行关闭代码的代码。 当您尝试关闭 NC 或 VC 时,是否有可能正在运行动画?这可以解释警告。尝试在 dispatch_async(dispatch_get_main_queue(), ^(void) [self.navigationController.topViewController?.dismiss(animated: false, completion: nil) ) 中添加关闭代码; 除了查看代码之外,有没有办法检查? 确保在所有Vc中调用viewWillAppear和viewDidLoad的超类实现以上是关于打开和关闭 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章
firefox 如何设置关闭之后再打开都是上次浏览时未关闭的页面