在呈现的 ViewController/NavigationController 上获取 UITabBarController

Posted

技术标签:

【中文标题】在呈现的 ViewController/NavigationController 上获取 UITabBarController【英文标题】:Get UITabBarController on presented ViewController/NavigationController 【发布时间】:2017-04-11 12:49:34 【问题描述】:

我正在展示来自 TabbarController 的导航控制器

let planSettingsVC = PlanSettingsViewController.instantiateFromStoryboard()
let planInfoNavCon = UINavigationController(rootViewController: planSettingsVC)

if let myTabBarVC = self.tabBarController as? MyPlanTabBarController 
        myTabBarVC.present(planInfoNavCon, animated: true, completion: nil)

PlanInfoNavCon 被呈现,现在我想访问呈现它的 TabBarController。

在图书馆找到:

open var tabBarController: UITabBarController?  get  // If the view controller has a tab bar controller as its ancestor, return it. Returns nil otherwise.

所以我在PlanSettingsViewController上尝试了以下操作

    print(self.tabBarController) 打印 nil

    print(self.presentingViewController.tabBarController) 打印 nil

    print(self.navigationController?.presentingViewController?.tabBarController) 打印 nil

    print(self.navigationController.tabBarController) 打印 nil

    self.navigationController?.presentingViewController as? MyPlanTabBarController 结果

我可以通过self.tabBarController 访问 TabBar 的 ViewController 上的 TabBarController 但是

如何访问显示此内容的 TabBarController?

附言

po self.navigationController 返回<UINavigationController>po self.navigationController?.presentingViewController 返回<UIViewController>

【问题讨论】:

【参考方案1】:

这段代码:

if let myTabBarVC = self.tabBarController as? MyPlanTabBarController 
        myTabBarVC.present(planInfoNavCon, animated: true, completion: nil)

说:“当前 planInfoNavCon 来自 self.tabBarController”

很好奇...似乎 NavController 中的每个 VC 都认为自己提供 NavController 的控制器提供...所以...

您仍然不需要额外的.tabBarController 部分,但您也不需要获取对导航控制器的引用。

这段代码,在PlanSettingsViewControllercurrent VC 中,应该获得对tabBarController 的正确引用:

var thePresenter = self.presentingViewController as? MyPlanTabBarController

所以,要从 planInfoNavCon 中获取对 tabBarController 的引用,您需要获取它的 presenter

var thePresenter = self.navigationController?.presentingViewController

您不想要额外的 .tabBarController 部分(可能需要其他 ? 展开 - 我实际上并没有运行此代码)。

【讨论】:

我试过这个。 self.navigationController?.presentingViewController as? MyPlanTabBarController 返回零 您是否已在 Debug 中逐步检查这些值?您确定 self.navigationController 在那时有效吗?如果您将其转换为as? MyPlanTabBarController,那么self.navigationController?.presentingViewController 的值/类是什么? 是的,我处于调试模式。 po self.navigationController 返回 <UINavigationController>po self.navigationController?.presentingViewController 返回 <UIViewController>。当我尝试将其转换为 TabBarController 时失败 有趣...查看我的编辑。适用于我的快速测试。 对我来说,当我尝试转换为 MyPlanTabBarController 时它返回 nil。编辑问题以包括屏幕截图。

以上是关于在呈现的 ViewController/NavigationController 上获取 UITabBarController的主要内容,如果未能解决你的问题,请参考以下文章

在动画呈现控制器视图的同时动画呈现控制器视图

如何在模态呈现的视图控制器上执行呈现模态序列?

从 AppDelegate 到 PresentedViewController 的警报:“尝试在...上呈现 UIAlertController 已经在呈现 UIAlertController”

警告:尝试在已经呈现的 MainTableViewController 上呈现 ModalTableViewController (null)

在呈现的视图控制器上的 UITableViewCell 中呈现 UIAlertController

尝试在等待 GKTurnBasedMatchmakerViewController 延迟呈现完成的 ViewController 上呈现 GameViewController