【问题标题】:SwiftUI 2.0 CoreData issues with new project - 'Cannot find type 'Item' in scope'新项目的 SwiftUI 2.0 CoreData 问题 - '在范围内找不到类型'项目''
【发布时间】:2020-12-15 14:45:53
【问题描述】:

[编辑] 我希望 Apple 能够修复明显的错误。解决办法是清除缓存,关闭再重新打开Xcode..

我正在使用 Xcode Beta 并开始一个新项目,但没有编写任何代码,我已经收到错误消息。我在网上找不到任何东西。也许这太新了?

在新版本的Xcode中我选择了new Project,

然后用 Core Data 打勾

如果我不勾选该框,我将获得带有“hello world”的通常的 Xcode SwiftUI 模板,但勾选 Core Data 框,我会从 Apple 获得更多模板代码,无需触及任何内容,也无需更改任何一行代码,我得到一个错误信息编译它..

错误是:“在范围内找不到项目”

非常令人沮丧,尤其是因为我的所有教程都是从经典的“AppDelegate”文件配置开始的。而新的 SwiftUI 是“通用的”!

我检查了文件.xcdatamodeld,它看起来不错,并且有“项目”实体。为什么不编译?

所以我现在不知所措,是否有解决方案或者这是一个错误,需要等待 Apple 发布修复程序。如果是这样,在那之前我不需要开始一个新项目!

PS 今天我用 CMD-ALT-SHIFT-K 清理了缓存,关闭了 Xcode,从模拟器中删除了应用程序,重新打开,重建,它确实编译了......但模拟器中什么也没有!我们正在进步!我仍然没有更改任何代码。一切都是 Apple 模板!

【问题讨论】:

  • 这是 Xcode 缓存...重新启动、重新打开、重建。
  • 我非常讨厌 CoreData。每次我试一试都会发生这样的事情。已经尝试了所有方法,包括 DerivedData 删除方法。没有任何效果。我什至无法获得为您运行而生成的 Apple 的基本模板。苹果加油!
  • 是的,我今天在使用 Xcode 12.3 时遇到了完全相同的问题,我刚刚完全关闭了 Xcode,然后重新启动它,一切正常。即使出现错误,我也能够进行构建,但无法在模拟器上运行项目。因此,如果您遇到无法在范围内找到实体的错误,请尝试重新启动 Xcode。
  • Xcode 12.4 版中仍然存在同样烦人的错误
  • 我遵循了上述建议并使用了 Cmd+B 并且成功了。它要求我撤销,然后授权我当前的计算机。

标签: ios swift core-data swiftui


【解决方案1】:

正常的 Xcode 清除对我有用:

  1. 清理构建文件夹(SHIFT + COMMAND + K

  2. 完全退出 Xcode

  3. 删除DerivedData/{Project Name}_some_hash中的项目内容

    默认位置是~/Library/Developer/Xcode/DerivedData,但如果找不到,请检查 Xcode → Preferences → Locations 下的 Derived Data 属性

  4. 再试一次(运行 Xcode 并构建)

【讨论】:

  • 我希望苹果现在已经修复了它......?但是仍然需要为每个新项目重新启动!
  • 步骤 3 似乎没有必要!
  • 一旦您清除了错误的编译器错误,您仍然会得到一个不执行任何操作的示例项目。请参阅下面的 Jakub Jakubowski 的答案(包括他的链接答案)以实际使应用程序可用。
【解决方案2】:

对于一个全新的项目,按Command+B构建就可以了。

【讨论】:

  • 当使用 Core Data 时,这绝对不适用于当前的 Xcode(12.5.1 和 13b6)
【解决方案3】:

首先,这不是您的应用程序的问题,而是预览的问题。您的应用程序在模拟器上正常运行。白屏是因为您需要使用 NavigationView() 包装您的列表以查看添加和编辑按钮。看到这个答案: https://stackoverflow.com/a/66234095/15224199

之后,您将在模拟器上看到添加和编辑按钮。 但是您也必须修复预览。它不起作用,因为你有一个空实体,你需要模拟它。 转到 Persistance.swift,您应该添加与我类似的 for 循环以在预览变量中创建模拟项目:

static var preview: PersistenceController = {
    let result = PersistenceController(inMemory: true)
    let viewContext = result.container.viewContext
    for _ in 0..<10 {
        let newItem = Item(context: viewContext)
        newItem.timestamp = Date()
    }
    do {
        try viewContext.save()
    } catch {
        // Replace this implementation with code to handle the error appropriately.
        // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
    return result
}()

最后确保您的预览使用这些模拟值:

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
    ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}

之后,它应该可以正常工作,希望对您有所帮助。 不知道为什么苹果提供的模板一开始就不能正常工作。

【讨论】:

    【解决方案4】:

    我没有发现任何其他答案对我有用,但有什么用:

    • 正在打开 (ProjectName).xcdatamodel
    • 给 Item 实体添加一个属性,应该没关系,我只是添加“String”类型的“foo”
    • Cmd-B 构建 (然后您可以随意删除新属性)。

    【讨论】:

      【解决方案5】:

      如果您仍然有问题,您可能忘记将您的.xcdatamodel 文件添加到测试目标中。

      【讨论】:

        【解决方案6】:

        Project Clean and Build 适合我。

        【讨论】:

          猜你喜欢
          • 2023-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多