className.type没有名为' appDel'的成员。

时间:2014-07-10 20:45:30

标签: ios swift

我引用了我的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)
}

2 个答案:

答案 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 }