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

时间:2014-11-14 16:45:53

标签: ios iphone xcode swift

我试图在公共的额外类文件中读/写数据。 (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 and Today Extension。

3 个答案:

答案 0 :(得分:0)

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

修改

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

答案 1 :(得分:-1)

您的问题:

  

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

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

Understanding How an App Extension Works上的App Extension编程指南部分清楚地解释了这一点:

  

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

     

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

答案 2 :(得分:-2)

要在App和Today Widget之间共享数据,遵循Apple指南,您必须在目标的功能选项卡下创建一个应用程序组,并将其链接到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/