我引用了我的app delegate
let appDel: AppDelegate = (UIApplication.sharedApplication().delegate) as AppDelegate
这很好用,但下面这行代码会出错:
let context: NSManagedObjectContext = appDel.managedObjectContext
它给了我以下错误:
'vctGebruikers.Type' does not have a member named 'appDel'
我在课堂下面宣布他们是这样的:
class vctGebruikers: UIViewController, UITableViewDelegate, UITableViewDataSource {
let appDel: AppDelegate = (UIApplication.sharedApplication().delegate) as AppDelegate
let context: NSManagedObjectContext = appDel.managedObjectContext
}
奇怪的是,当我将代码粘贴到viewDidLoad
或函数中时,代码才能正常工作。我无法弄清问题是什么。
我该如何解决这个错误?
编辑: 我还需要访问上下文:
let results: NSArray = context.executeFetchRequest(request, error: nil)
感谢@Antonio,这是我的工作,但现在我无法访问上下文和appDel
init(coder aDecoder: NSCoder!) {
let appDelegate = (UIApplication.sharedApplication().delegate) as AppDelegate
self.appDel = appDelegate
self.context = appDelegate.managedObjectContext
super.init(coder: aDecoder)
}
答案 0 :(得分:0)
在swift中,在初始化所有类属性之前,您无法引用self
。
您在此行中隐式使用self
:
let context: NSManagedObjectContext = appDel.managedObjectContext
解决方案是在初始化程序中初始化它们,但使用类似的东西:
let appDelegate = (UIApplication.sharedApplication().delegate) as AppDelegate
self.appDel = appDelegate
self.context = appDelegate.managedObjectContext
另请阅读here,几天前在SO上提出了类似的问题。
答案 1 :(得分:0)
实例化上下文的一种方法是向下钻取而不是向上钻取AppDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let vc = window?.rootViewController as? UIViewController {
vc.context = self.managedObjectContext}
`
在视图控制器中,告诉它动态填充
var context: NSManagedObjectContext!
也不要忘记打电话
import CoreData
您使用所述对象的地方
另一个最终方法:使用闭包以便在运行时进行引用:
var context: NSManagedObjectContext {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
return appDelegate.managedObjectContext
}