我已将 ViewController 嵌入选项卡栏控制器中,现在我的 coreDataStack.managedContext 失败

Posted

技术标签:

【中文标题】我已将 ViewController 嵌入选项卡栏控制器中,现在我的 coreDataStack.managedContext 失败【英文标题】:I've embedded my ViewController in a Tab Bar Controller and now my coreDataStack.managedContext fails 【发布时间】:2019-04-25 16:18:03 【问题描述】:

我的启动应用程序运行良好,但是现在我想开始添加额外的功能,因此我将初始视图(已经在导航控制器中)嵌入到选项卡栏控制器中。当它停止工作时。

我相信这与我在 AppDelegate 文件中设置 managedContext 的方式有关。您将在下面的代码示例中看到我已将设置从 UINavigationController 和 .topViewController 更改为 UITabBarController 和 .selectedViewController 但是当代码执行时它立即失败并在初始视图的 ViewController.swift 类文件中显示错误。

// **** 来自 ViewController 的示例代码:

do 
  let results = try managedContext.fetch(LocationFetch)    <—— Thread 1: Fatal error: …
  if results.count > 0 
    // Fido found, use Fido
    currentLocation = results.first
   else  

// **** AppDelegate 文件中的示例代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
guard let navController = window?.rootViewController as? UITabBarController,
    let viewController = navController.selectedViewController as? ViewController else 
        return true


viewController.managedContext = coreDataStack.managedContext
return true

我对 Swift 的了解还不够,无法自己解决这个问题,因此任何指向正确方向的指针都会有所帮助。我看过很多地方,但我没有经验来解决这个问题。

【问题讨论】:

您能否将完整的错误消息添加到您的问题中?另外,您的managedContext 分配是否实际执行,如果是,它设置了什么值? 这是完整的错误消息:线程 1:致命错误:在隐式展开可选值时意外发现 nil) 【参考方案1】:

我从其他地方得到了解决方案(谢谢 S.Gerrard),我对 AppDelegate 中的问题以及与视图更改有关的问题是正确的,尽管我接近了一个我还没有经验的解决方案把它完全正确地拼凑起来……

由于根控制器不再是 UINavigationController,所以 navController 为 nil,并且永远不会分配 viewController.managedContext。

我需要将“if 块”替换为首先获取选项卡控制器,然后从其第一个选项卡 (viewControllers?[0]) 获取导航控制器,然后从中获取视图控制器并执行分配的东西:

如果 让 tabController = window?.rootViewController 作为? UITabBarController, 让 navController = tabController.viewControllers?[0] as? UINavigationController, 让 viewController = navController.topViewController 作为?视图控制器 viewController.managedContext = coreDataStack.managedContext

【讨论】:

以上是关于我已将 ViewController 嵌入选项卡栏控制器中,现在我的 coreDataStack.managedContext 失败的主要内容,如果未能解决你的问题,请参考以下文章

在 ViewController 中重新加载/刷新选项卡栏项目?

导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS

选项卡栏在转场后消失

有条件地在选项卡栏项后面选择viewcontroller

在启动时以编程方式为 5 个选项卡栏项目设置选项卡栏标题,其中 4 个嵌入在导航控制器中,1 个没有。目标 C

在标签栏控制器中嵌入导航控制器会更改视图控制器的安全区域