使用未申报的类型' AppDelegate'迅速

时间:2014-11-19 16:48:11

标签: ios core-data swift xcode6.1 ios8.1

我刚刚花了半天时间试图解决下一个问题。 我正在使用Swift语言测试CoreData。 关注this教程一切正常。

但在考试后我试图修改structure和我的代码。其中的'src'和组是文件夹,而不仅仅是xCode创建的组。

NSSExpense.swift

import Foundation
import CoreData

class NSSExpense: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var descr: String
    @NSManaged var value: NSNumber
    @NSManaged var isMonthly: NSNumber
    @NSManaged var payDayInMonth: NSNumber

    class func createInManagedObjectContext(moc: NSManagedObjectContext, name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
        let newExpense = NSEntityDescription.insertNewObjectForEntityForName("NSSExpense", inManagedObjectContext: moc) as NSSExpense

        newExpense.name = name
        newExpense.value = NSNumber(double: value)
        newExpense.payDayInMonth = NSNumber(short: payDayInMonth)
        newExpense.isMonthly = NSNumber(bool: isMonthly)

        if let expenseDesctiption = descr {
            newExpense.descr = expenseDesctiption
        } else {
            newExpense.descr = ""
        }

        return newExpense
    }
}

NSSDataManager.swift

import UIKit
import CoreData

class NSSDataManager: NSObject {

    class var sharedDataManager: NSSDataManager {
        struct Static {
            static var instance: NSSDataManager?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            Static.instance = NSSDataManager()
        }

        return Static.instance!
    }

    lazy var managedObjectContext : NSManagedObjectContext? = {
        // Error at the next line "Use of undeclared type 'NSSAppDelegate'"
        let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

        if let managedObjectContext = appDelegate.managedObjectContext {
            return managedObjectContext
        } else {
            return nil
        }
    }()

    var expensesInMemory : [NSSExpense] {
        get {
            let fetchRequest = NSFetchRequest(entityName: "NSSExpense")
            if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSSExpense] {
                return fetchResults
            } else {
                return [NSSExpense]()
            }
        }
    }

    func addExpenseWithName(name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
        return NSSExpense.createInManagedObjectContext(managedObjectContext!, name: name, value: value, payDayInMonth: payDayInMonth, isMonthly: isMonthly, descr: descr?)
    }

}

我试图以不同的方式解决这个问题:   1)创建新项目(Swift主语言)并再次生成相同的结构(失败)   2)创建新项目(Objective-C主要语言)。所以我有AppDelegate.h和AppDelegate.m。使用Bridging-Header将其添加到Swift文件中。一样的问题。 (失败)

接下来真的很有意思。如果我将下一个代码放到ViewController.swift中,它会自动创建新项目,一切正常。但是当我把这个代码放到任何其他类时。我编写了这个错误。

lazy var managedObjectContext : NSManagedObjectContext? = {
        // Error at the next line "Use of undeclared type 'NSSAppDelegate'"
        let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

        if let managedObjectContext = appDelegate.managedObjectContext {
            return managedObjectContext
        } else {
            return nil
        }
    }()

[更新1]

我试图在与NSSAppDelegate.swift相同的文件夹中创建另一个类,现在一切正常。但是它仍然是一个问题,我如何使用存储在其他文件夹中的类?


[更新2]

试图在其他项目中做同样的事情。 如果文件结构类似this,那么AppDelegate.swift和NGDataManager.swift在同一个文件夹中,一切都很好。 但是,如果我将NGDataManager.swift放在'{s}'文件夹(如this(不仅仅是组,文件夹)中,则会发生error。也许我应该为此创建另一个问题。


[更新3]

我不知道如何,但你可以忘记我在UDATE 2中所说的一切。因为现在这一切都行不通。我甚至用CoreData创建了一个名为“Test”的新项目,只创建一个名为“TestClass”的新类。接下来就是魔术:如果我把这段代码放在TestClass.swift

import UIKit

class TestClass: NSObject {
    func someFunc() {
        let appDel = UIApplication.sharedApplication().delegate as AppDelegate
    }
}

发生错误。但是,如果我将此行放在ViewController.swift中的viewDidLoad中,该行由xCode自动生成

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let appDel = UIApplication.sharedApplication().delegate as AppDelegate
    }
}

他们没有错误,一切都很好。我不知道该说什么......

您可能会看到AppDelegate代码here,但我没有修改xCode自动生成的任何内容。我已经使用this设置创建了一个单一视图应用程序。

7 个答案:

答案 0 :(得分:52)

您可能在创建项目时创建了“{ProjectName}测试”目标。问题是AppDelegate未在“{ProjectName}测试”目标中分配成员资格。

选择AppDelegate.swift然后在右侧检查器中单击File Inspector(纸张图标),然后确保在“Target Membership”中将项目和测试目标复选标记都设置为ON。

清洁,重建。

答案 1 :(得分:16)

如果尝试在Swift代码中访问Objective-C AppDelegate,请确保在桥接头文件中有Observable

这让我陷入了大约一个小时: - /

答案 2 :(得分:4)

当我在“产品”菜单中执行“清洁”选项时,我遇到了类似的问题

答案 3 :(得分:2)

确保每个文件中的目标成员资格设置相同。单击特定文件时,可以在属性检查器中找到目标成员资格。

答案 4 :(得分:2)

它假设是这样的。

let appDelegate: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)

答案 5 :(得分:2)

在Xcode 8中遇到这个问题,这是我在谷歌上搜索所以添加我的解决方案时的第一个结果。

如果您的项目具有UI和单元测试,请确保将AppDelegate添加到两个目标成员资格中。一旦我将它添加到我的测试中,我就可以访问我在AppDelegate中的任何变量而无需使用UIApplication.shared,无论我的文件是如何分组的。

要检查,请转到AppDelegate,单击文件检查器,然后查看Target Membership

答案 6 :(得分:0)

而不是:

let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

尝试:

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