【问题标题】:App and Extension - Use Core data == error : sharedApplication()' is unavailable应用和扩展 - 使用核心数据 == 错误:sharedApplication()' 不可用
【发布时间】:2014-11-14 16:45:53
【问题描述】:

我正在尝试在公开的额外类文件中读取/写入数据。 (StoreData.swift)

我的功能:

  func FetchName (NameforDate: String) -> NSString
         {
             var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
             var context:NSManagedObjectContext = appDel.managedObjectContext! 
    }

在 "(UIApplication.sharedApplication()." 所在行我收到错误:

StoreData.swift:115:49:“sharedApplication()”不可用:使用视图 适当时基于控制器的解决方案。

我创建了 App 和 Today Extension。

【问题讨论】:

  • UIApplication 在扩展中不可用。
  • 我正在尝试寻找其他方法如何在没有 UIApplication 的情况下访问 CoreData
  • 你不需要 UIApplication 来访问 CoreData。您的应用程序和扩展程序必须各自独立访问核心数据。这可以通过多种方式完成,但这超出了您的问题范围。
  • hmm...你能给我一个建议吗?如何在没有 UIApplication 的情况下将数据读/写到 CoreData? ... var context:NSManagedObjectContext = xxx.managedObjectContext 之类的东西? ..
  • 你必须写一个不同的问题。这个问题是关于为什么您无法访问 sharedApplication

标签: ios iphone xcode swift


【解决方案1】:

如果您需要托管对象上下文,您可以在您的扩展中创建自己的。您的 AppDelegate 将不可用。我建议将其从您的应用程序委托转移到您可以在两者之间共享的类。您仍然可以监听核心数据更新,因此它们不需要共享上下文/持久存储坐标。

编辑:

我想指出,扩展程序本质上是一个不同的沙盒。因此,如果您创建一个共享类,实例将不会在 App 和 Extension 之间共享。因此使持久存储协调器和上下文不同。

【讨论】:

  • 我的公共类与 App 的 ViewController 和 TodayViewController 通信以通过所有变量进行扩展,这没关系,但是当我创建一些 SharedApplication 数据时,它给了我一个错误......
  • 确保将您创建的类添加到两个目标中。
【解决方案2】:

您的问题:

StoreData.swift:115:49:“sharedApplication()”不可用:在适当的情况下使用基于视图控制器的解决方案。

是因为-[UIApplication sharedApplication] 不可用于扩展。您的扩展程序不会作为应用程序的一部分运行,因此消息扩展程序没有应用程序上下文。

这在Understanding How an App Extension Works 的应用程序扩展编程指南部分中有明确解释:

由于其在系统中的主要作用,应用扩展程序没有资格参与某些活动。应用扩展不能:

• 访问 sharedApplication 对象,因此不能使用该对象的任何方法

【讨论】:

  • 感谢您的回复!它应该可以帮助我找到另一种方法,如何在没有 UIApplication 的情况下访问 CoreData ... 还有其他一些方法如何在没有 UIApplication 的情况下将数据读/写到 CoreData ? ...谢谢
  • CoreData 完全独立于 UIKit 和 UIApplication。它是一个完全独立的框架,不依赖于 UIKit。
  • @quellish,那么如何从 gmail/google drive/messenger 应用程序打开/导入文件到我的应用程序?任何解决方法?
【解决方案3】:

要在 App 和 Today Widget 之间共享数据,遵循 Apple 指南,您必须在目标的功能选项卡下创建一个 App Group 并将其链接到 App 和 Widget。

要访问您的共享默认值:

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:YOUR_APP_GROUP_ID];

它的工作原理与 [NSUserDefaults standardUserDefaults] 完全一样,因此您可以存储数据的最小部分,但这是您所能做的。

编辑:

您可以在此处找到 Suite Defaults 的 Swift 文档: https://developer.apple.com/Library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/occ/instm/NSUserDefaults/initWithSuiteName:

编辑 2:

改为使用单例访问您的核心数据,您可以在此处找到一个简单的教程: http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

【讨论】:

  • 使用 NSUserDefaults 是个问题,因为我想在下拉小部件或打开应用程序时刷新应用程序数据...刷新应用程序数据基于我的应用程序的 CoreData... 例如,当我拉下 Widget 我想调用函数 refresh_data() 并从该函数中获取一个新变量.. 该函数从 CoreData 加载数据
  • 您是否尝试将 NSManagedObjectContext 移动到单例类而不是您的 AppDelegate 中?这将使您的核心数据可以从今天的小部件访问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2017-05-31
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多