无法关闭嵌入在导航控制器中的两个视图控制器

Posted

技术标签:

【中文标题】无法关闭嵌入在导航控制器中的两个视图控制器【英文标题】:Unable to Dismiss Two View Controllers Embedded Within a Navigation Controller 【发布时间】:2014-12-29 02:58:28 【问题描述】:

我正在开发一个应用程序,其中根视图控制器,称为“ROOT”,呈现一个视图,一个辅助视图控制器,称为“A”,它嵌入在导航控制器中,称为“NAV”。

“ROOT”通过其类实现中的以下调用以模态方式呈现“A”。

self.presentViewController(A, animated: true, completion: nil)

“A”视图中的按钮然后将“B”推送到“NAV”视图控制器堆栈上。

在“B”的类实现中,当按下按钮时,我试图将用户发送回“ROOT”负责的视图。以下方法有效:

self.presentViewController(ROOT, animated: true, completion: nil)

以下调用没有,尽管我认为他们应该考虑到“A”是由“ROOT”以模态方式呈现的:

self.navigationController?.presentingViewController.dismissViewControllerAnimated(true, completion: nil)
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)

但是,我发现以下两个对象都是'nil'

self.navigationController?.presentingViewController
self.navigationController?.presentedViewController

为什么不起作用的调用不起作用?这不是正确的做法吗?

实际上工作的方式不是基本上在内存中添加另一个视图和视图控制器来跟踪吗?因此,如果我一遍又一遍地从“根”到“A”到“B”再回到“根”最终会占用太多内存?

为什么最后列出的两个对象显示为 nil?

【问题讨论】:

你不应该展示A,你应该展示NAV。 【参考方案1】:

如果您想推送ViewController,它应该在NavigationController 内。将“A”设置为“NAV”的rootViewController。然后呈现“NAV”。

它最终会显示“A”。然后就可以push popViewController的了。

如果你使用故事板试试这个:

let B = self.storyboard.instantiateViewControllerWithIdentifier ("B") as B

self.navigationController.pushViewController(B, animated: true)

编辑:

如果您想在某些视图之间导航,最好将所有这些视图放在一个导航控制器中。或者你可以这样做:

首先将 NAV('ROOT' 作为它的 rootViewController)设置为窗口的 rootViewController。如果 ROOT 是登录屏幕,当用户登录成功时,将“A”设置为其 rootViewController。如果我考虑回到 ROOT 意味着您正在注销,那么只需将您的 NAV 的 rootViewController 更改为 ROOT。我有一个 Objective-C 示例:

在我的 AppDelegate 中:

LoginView *myAcc = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController : myAcc];
self.window.rootViewController = navController;

用户登录成功时:

AccountMenu *accMenu = [[AccountMenu alloc] initWithNibName:@"AccountMenu" bundle:nil];
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
[viewControllers removeLastObject];
[viewControllers addObject:accMenu];
[[self navigationController] setViewControllers:viewControllers animated:YES];

这只是我分享的一个想法,尝试与您的要求相匹配。 :)

希望这会有所帮助.. :)

【讨论】:

这确实是“A”呈现“B”的方式。但是,我想将屏幕返回到“ROOT”,这是呈现“A”的视图控制器。 “A”作为根视图控制器嵌入在导航控制器中。如果“A”(以及它所嵌入的导航控制器)由“ROOT”以模态方式呈现,我应该能够通过解除“A”或“B”正确地回到“ROOT”? 在导航中嵌入root有什么问题吗?然后推 A 和 B ? 可能不会。我只是想知道是否有一种方法可以做到这一点而不将其嵌入其中。如果您(或其他任何人)知道这样做的方法,那将是最好的。否则我认为这就是它必须走的方向。

以上是关于无法关闭嵌入在导航控制器中的两个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

无法从 iOS 的情节提要中嵌入导航控制器

Swift:嵌入在导航控制器中的视图之间的自定义segue

加载嵌入在导航中的视图控制器

如何导航到嵌入在标签栏控制器中的视图控制器

UIScrollView 是不是仅适用于嵌入在导航控件中的视图控制器?

视图控制器中的集合视图,单元格触摸集合视图本身的顶部边框(嵌入在导航控制器中)