在呈现的 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
部分,但您也不需要获取对导航控制器的引用。
这段代码,在PlanSettingsViewController
的current 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