TabbarController 子控制器总是返回 nil - Swift 4

Posted

技术标签:

【中文标题】TabbarController 子控制器总是返回 nil - Swift 4【英文标题】:TabbarController child controller always return nil - Swift 4 【发布时间】:2018-09-09 21:27:22 【问题描述】:

我正在尝试从子控制器访问对象,但它总是返回 nil。请检查以下代码。

let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc: UITabBarController = mainStoryboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController
vc.selectedIndex = 2
let vc1 = vc.viewControllers?[2] as? FormViewController //this line returns nil
vc1?.fillUserData(dataDic: convertJsonStringToDictionary(jsonString: decodedURL))
vc1?.formViewDelegate = self
self.present(vc, animated: true, completion: nil)

请多指教。

【问题讨论】:

它可能为零,因为第三个视图控制器不是FormViewController。也许它是一个导航控制器。 我确定第三个视图控制器是 formviewcontroller 并且它嵌入在导航控制器中。 这就是我的全部观点。 vc.viewControllers?[2]不是FormViewController,而是UINavigationController。这就是为什么你会得到nil 【参考方案1】:

根据您的 cmets,第三个选项卡实际上是 UINavigationController,其中 FormViewController 作为其 rootViewController

将您的代码更新为:

if let nc = vc.viewControllers?[2] as? UINavigationController, let vc1 = nc.topViewController as? FormViewController 
    vc1.fillUserData(dataDic: convertJsonStringToDictionary(jsonString: decodedURL))
    vc1.formViewDelegate = self

【讨论】:

【参考方案2】:

你可以试试

let nav = vc.viewControllers?[2] as? UINavigationController
let vc1 = nav?.topViewController as? FormViewController

注意:您不应在此处访问任何 UI 元素

vc1?.fillUserData(dataDic: convertJsonStringToDictionary(jsonString: decodedURL))

因为它会使应用程序崩溃

【讨论】:

以上是关于TabbarController 子控制器总是返回 nil - Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:将数据从 TabBarController 传递到子视图控制器

viewWithTag 在子视图控制器中总是返回 nil

iOS 项目架构tabbarController 嵌套 navbarController

UIViewController 上的自定义属性,如 splitViewController 或 tabBarController

带导航栏的 TabBarController

以编程方式返回选项卡栏控制器中的视图