UIApplicationDelegate 在 Swift 应用程序中没有名为 managedObjectContext 的成员

Posted

技术标签:

【中文标题】UIApplicationDelegate 在 Swift 应用程序中没有名为 managedObjectContext 的成员【英文标题】:UIApplicationDelegate does not have a member named managedObjectContext in Swift app 【发布时间】:2014-08-15 19:43:02 【问题描述】:

我想在我的 Swift ios 应用程序中使用 Core Data,但是如何从任何 ViewControllers 中调用 Core Data 的 managedObjectContext?

假设我想调用这个在 Objective-C 中经常使用的方法:

self.managedObjectContext = ((AppDelegate *) [UIApplication sharedApplication].delegate).managedObjectContext;

但是,当我在 Swift 文件中编写以下代码时,出现错误:UIApplicationDelegate does not have a member called managedObjectContext

var appDelegate = UIApplication.sharedApplication().delegate
println(appDelegate.managedObjectContext)

为什么会出现错误?因为我在创建应用时检查了Core Data,所以模板自动在AppDelegate.swift文件中定义了managedObjectContext变量。

那么缺少什么?我使用 Xcode 6 beta 5。

【问题讨论】:

因为UIApplicationDelegate没有这个属性,所以你已经把它添加到AppDelegate了。 【参考方案1】:

您需要将应用委托转换为您项目的应用委托类型。

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context = appDelegate.managedObjectContext

【讨论】:

【参考方案2】:

推荐的方法是将NSManagedObjectContext 传递给第一个视图控制器,然后再传递给后续的视图控制器。这就是 Apple Xcode (objective-c) 模板所做的。实现UIApplicationDelegate 的对象创建NSManagedObjectContext 及其依赖项,然后将该对象设置为第一个视图控制器上的 managedObjectContext 属性。

您收到此编译错误的原因是UIApplicationDelegate 协议未定义属性managedObjectContext。当您尝试访问作为应用程序委托的对象时:

UIApplication.sharedApplication().delegate

返回的对象只知道实现UIApplicationDelegate 协议描述的方法。这不包括managedObjectContext

【讨论】:

那么为什么Objective-C 的代码可以工作,而我的Swift 代码不行?或者,Swift 的正确端口是什么? 再次,建议将上下文传递到视图控制器。不从应用程序委托中获取它。这是做到这一点的正确方法。您的代码不起作用,因为 UIApplicationDelegate 协议不包含“managedObjectContext”。 UIApplication.sharedApplication().delegate 返回一个符合该协议的对象。如果该对象的实例响应其他消息,编译器不知道。

以上是关于UIApplicationDelegate 在 Swift 应用程序中没有名为 managedObjectContext 的成员的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行 GHUnit 中使用 UIApplicationDelegate?

其他类中的 UIApplicationDelegate 函数

iPhone:UIApplicationDelegate 和启动图像?

什么是 Cordova 的 UIApplicationDelegate 等价物

在越狱设备上使用后台程序时未调用 UIApplicationDelegate

无法使用 [UIApplication sharedApplication]。如何在 UIApplicationDelegate 之外注册通知?