4

鉴于我已经根视图控制器哪个是UIApplication.shared.delegate?。窗户??。rootView控制器,我想抓取活动导航控制器(如果有的话)。

到目前为止,我得出的结论是:

保护变量控制器=rootViewController?。presentedViewController else{将rootViewController作为UINavigationController返回}while let presented=控制器.presentedViewController{控制器=显示}控制器=控制器。导航控制器??控制器返回控制器为?UI导航控制器

这就足够了吗?合作给了我这个解决方案,但我不明白的是rootViewController?。演示视图控制器.应该是吗rootViewController?。演示视图控制器?

2
  • 建议检查来自的答案在这里,抓取顶部视图控制器,然后获取导航控制器
    – Tj3n型
    评论 2018年8月1日3:50
  • 1
    您只需使用self.navigationController来设置当前活动的导航控制器 评论 2018年8月1日5:00

2个答案2

重置为默认值
16

使用下面的扩展来抓取最上面的或当前可见的UIView控制器UI导航控制器.

扩展UI应用程序{类func topViewController(_viewController:UIViewController?=UIApplication.shared.keyWindow?.rootViewController)->UIViewController?{如果让nav=viewController为?UI导航控制器{return topViewController(导航可见视图控制器)}如果let tab=viewController为?UI选项卡栏控制器{如果选择let=tab.selectedViewController{return topViewController(选中)}}如果让显示=viewController?。演示视图控制器{return topViewController(显示)}返回视图控制器}类函数topNavigationController(_viewController:UIViewController?=UIApplication.shared.keyWindow?.rootViewController)->UINavigationControl?{如果让nav=viewController为?UI导航控制器{返回导航}如果let tab=viewController为?UI选项卡栏控制器{如果选择let=tab.selectedViewController{return selected.navigation控制器}}return viewController?。导航控制器}}

如何使用?

让objViewcontroller=UIApplication.topViewController()

让objNavigationController=UIApplication.topNavigation()
2
  • 不,1)我不想扩展,也没有要求扩展2)我不想要递归解决方案,3)你错过了整个问题。如果你读了我的帖子,我会问两件事:1)我的解决方案足够吗?2)我为什么要使用演示视图控制器结束演示视图控制器。如果你想更新你的答案以反映这一点,并且它有效,那么我会接受。
    – 垃圾桶
    评论 2018年8月1日16:54
  • 1
    在SwiftUI中,我在选项卡视图中嵌入了4个导航堆栈。我在UIKit中使用了类似的东西来poptoroot。我发现它只适用于第一个选项卡。解决方案是使用上述代码找到tabviewcontroller,然后在选项卡视图中找到所选的导航控制器。现在我可以从每个标签中弹出根目录!谢谢! 评论 2022年11月16日20:32
0

这足够吗?

只有你知道。它在你的情况下可靠吗?如果是,它可能足以满足您的需求。但这并不是通常正确的答案。

正如@vivekDas在评论中提到的那样,一种更可靠的方法是使用导航控制器方法,该方法返回图形中最近的视图控制器,即导航控制器。

…我不明白的是rootViewController?。演示视图控制器.应该是吗rootViewController?。演示视图控制器?

不。假设您有两个视图控制器,b条、和礼物b条在这种情况下,a.演示视图控制器b条、和b.演示ViewController.所以rootViewController.presentedViewController是视图控制器rootView控制器礼物。rootViewController.presentingViewController将是呈现的控制器rootView控制器.但是rootView控制器是视图控制器对象图的根;根据定义,它还没有被任何其他视图控制器显示,所以rootViewController.presentingViewController将永远为零。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.