应用和扩展 – 使用核心数据==错误:sharedApplication()’不可用

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

我的function:

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。

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

要访问您的共享默认值:

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

它的工作方式与[NSUserDefaults standardUserDefaults]完全相同,因此您可以存储数据的最小部分,但这就是您所能做的一切。

编辑:

在这里,您可以找到套件默认值的Swift文档: https : //developer.apple.com/Library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/occ/instm/NSUserDefaults/ initWithSuiteName :

编辑2:

使用Singleton来访问您的Core Data,您可以在这里找到一个简单的教程: http : //www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

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

编辑:

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

你的问题:

StoreData.swift:115:49:’sharedApplication()’不可用:改为使用基于视图控制器的解决方案。

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

有关了解应用程序扩展如何工作的应用程序扩展编程指南一节中对此进行了详细说明:

由于其在系统中的重点作用,应用程序扩展不符合参与某些活动的资格。 应用扩展程序不能:

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