【问题标题】:Use of undeclared type 'AppDelegate' Swift使用未声明类型 'AppDelegate' Swift
【发布时间】:2014-11-19 16:48:11
【问题描述】:

我刚刚花了半天时间试图解决下一个问题。 我正在使用 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 放在像this(不仅仅是组、文件夹)这样的“src”文件夹中,则会出现error。也许我应该为此创建另一个问题。


[更新 3]

我不知道怎么做,但你可以忘记我在 UDATE 2 中所说的一切。因为现在这一切都行不通了。我什至使用名为“Test”的 CoreData 创建了一个新项目,并创建了一个名为“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 设置创建了一个单一视图应用程序。

【问题讨论】:

  • 'NSSAppDelegate' - 那应该是什么?确定是NSApplicationDelegate
  • 你不应该在你的类前面加上NS,你以后会遇到各种各样的问题。
  • @sbarow 这是我的公司前缀 NSS。但请确保您是对的,将创建另一个前缀。不过我试过用 AppDelegate,不带前缀,这里只显示最后的代码版本。
  • @AlexandrLapshin 你能把AppDelegate的代码贴出来吗
  • @sbarow 我的天啊!看来我找到了答案。我忘了说我创建的所有类也是为测试创建的。如果我从 this 这样的测试目标中删除标记,一切正常!是 Swift 的 bug 还是功能,我真的不知道?

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


【解决方案1】:

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

选择 AppDelegate.swift 然后在右侧检查器中单击文件检查器(纸张图标),然后确保在“目标成员资格”中您的项目和测试目标复选标记都设置为 ON。

清理,重建。

【讨论】:

  • @Tieme 这对我不起作用(我认为主要原因是因为我在另一个文件夹中创建了类,而不是在与 AppDelegate.swift 文件相同的文件夹中。我有下一个结构:MyProjFolder :{ AppDelegate.swift srcFolder:{ SomeClass.swift}} SomeClass.swift 在其范围内看不到 AppDelegate。
  • 没关系
  • @Tieme 但确实如此。我在几个项目中尝试过几次,如果我把这个类放在另一个文件夹中,这个类就看不到AppDelegate了。
  • 非常感谢@Ramin,花了大约 6 个小时来解决这个问题,但您的解决方案就像一个魅力 :)
【解决方案2】:

如果尝试在 Swift 代码中访问 Objective-C AppDelegate,请确保您的桥接头文件中有 #import "AppDelegate.h"

这让我停留了大约一个小时 :-/

【讨论】:

  • 谢谢,节省了我的时间
  • 如果扩展 AppDelegate,还要确保在扩展前添加“@objc”...
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在 Xcode 8 中遇到了这个问题,这是我在 google 上搜索时的第一个结果,因此添加了我的解决方案。

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        应该是这样的

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

        【讨论】:

          【解决方案7】:

          代替:

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

          尝试:

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

          【讨论】:

          • 我以前试过这个。同样的问题。查看问题更新。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多