Xcode 8为iOS 10生成损坏的NSManagedObject子类

Rem*_*els 63 core-data nsmanagedobject ios10 xcode8

我最近将我的iOS应用程序项目更新到iOS 10.现在我正在尝试更改我的应用程序的核心数据模型,但Xcode生成的新NSManagedObject子类已损坏.我也尝试修复子类手册,但这不起作用.

Core Data Model的最小工具版本设置为Xcode 7.0,代码生成语言设置为Swift.

这是Xcode生成的代码:

import Foundation
import CoreData
import 

extension Group {

    @nonobjc public class func fetchRequest() -> NSFetchRequest {
        return NSFetchRequest(entityName: "Group");
    }

    @NSManaged public var name: String?
    @NSManaged public var platform: NSNumber?
    @NSManaged public var profiles: NSOrderedSet?

}

// MARK: Generated accessors for profiles
extension Group {

    @objc(insertObject:inProfilesAtIndex:)
    @NSManaged public func insertIntoProfiles(_ value: SavedProfile, at idx: Int)

    @objc(removeObjectFromProfilesAtIndex:)
    @NSManaged public func removeFromProfiles(at idx: Int)

    @objc(insertProfiles:atIndexes:)
    @NSManaged public func insertIntoProfiles(_ values: [SavedProfile], at indexes: NSIndexSet)

    @objc(removeProfilesAtIndexes:)
    @NSManaged public func removeFromProfiles(at indexes: NSIndexSet)

    @objc(replaceObjectInProfilesAtIndex:withObject:)
    @NSManaged public func replaceProfiles(at idx: Int, with value: SavedProfile)

    @objc(replaceProfilesAtIndexes:withProfiles:)
    @NSManaged public func replaceProfiles(at indexes: NSIndexSet, with values: [SavedProfile])

    @objc(addProfilesObject:)
    @NSManaged public func addToProfiles(_ value: SavedProfile)

    @objc(removeProfilesObject:)
    @NSManaged public func removeFromProfiles(_ value: SavedProfile)

    @objc(addProfiles:)
    @NSManaged public func addToProfiles(_ values: NSOrderedSet)

    @objc(removeProfiles:)
    @NSManaged public func removeFromProfiles(_ values: NSOrderedSet)

}
Run Code Online (Sandbox Code Playgroud)

编辑:这些是Xcode给出的具体错误:

1. Group+CoreDataProperties.swift:13:1: Expected identifier in import declaration (the empty import)
2. Group+CoreDataProperties.swift:13:11: 'Group' is ambiguous for type lookup in this context
3. Group+CoreDataProperties.swift:15:16: Cannot specialize non-generic type 'NSFetchRequest'
4. Group+CoreDataProperties.swift:26:11: 'Group' is ambiguous for type lookup in this context
4. Group+CoreDataProperties.swift:43:82: 'SavedProfile' is ambiguous for type lookup in this context
Run Code Online (Sandbox Code Playgroud)

Lon*_*ang 106

我终于让我上班了.这就是我做的.(航班是我的实体之一)

我按如下方式设置了xcdatamodeld

在此输入图像描述

然后是实体

在此输入图像描述

然后我使用了Editor - > Create NSManagedObject Subclass

这为我的航班实体创建了两个文件

机票+ CoreDataProperties.swift

机票+ CoreDataClass.swift

我将Flights + CoreDataClass.swift重命名为Flights.swift

Flights.swift就是

import Foundation
import CoreData

@objc(Flights)
public class Flights: NSManagedObject {

}
Run Code Online (Sandbox Code Playgroud)

航班+ CoreDataProperties.swift是

import Foundation
import CoreData


extension Flights {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Flights> {
        return NSFetchRequest<Flights>(entityName: "Flights");
    }

    @NSManaged public var ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎对我有用.即使我尝试了许多其他的建议,我也无法让Codegen以任何其他方式工作.

这也让我抓了一会儿,我把它作为助手添加.不要忘记使用新的Generics版本的FetchRequest,你可以做到这一点

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Flights")
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,非常感谢!我也花了太长时间试图找到一个解决方案,只会导致极度沮丧.我尝试了你能想到的每一种方式,除此之外没有任何效果.您必须为`Codegen`选项选择`Manual/None`.如果这仍然是"类定义",它似乎不起作用.再次感谢您的帮助! (4认同)
  • 这不适合我.我的解决方案是将Tools version minimun更改为Xcode 7.3 ....很奇怪:S (2认同)

Rya*_* H. 42

我相信您在生成NSManagedObject子类文件后遇到这些错误的原因可能与您在更改数据模型时选择的Codegen选项有关.

我不认为这是一个错误.至少在Xcode 8.1(8B62)中没有.

我遇到了类似的问题并通过将Codegen选项更改为"Manual/None"并将Module选项保留为"Global Namespace"来修复它.然后我生成了我的NSManagedObject子类文件.但是,根据您的具体情况,您甚至可能不需要生成NSManagedObject子类.

以下是我对Apple的文档,Apple开发人员论坛和我自己的项目测试的实体Codegen选项的更多详细信息.

选项1:"类定义"

  • 将此视为"即插即用"选项

  • 使用模型编辑器创建希望Core Data管理的实体和关联属性.

  • 不要使用NSMangagedObject子类生成器.Xcode会自动为您生成所需的文件(但它们不会显示在项目导航器中).

  • 如果您确实生成了NSManagedObject文件,Apple会告诉您不应在所述文件的标题注释中编辑这些文件.如果您确实需要编辑这些文件,那么这是您需要使用其他Codegen选项的好兆头.

  • 保留实体的默认类选项(Module = Global Namespace和Codegen = Class Definition)

  • 如果需要覆盖NSManagedObject的方法,可以使用Class选项下的Name创建扩展.

    // Optional extension in Entity.swift extension Entity { // Override NSManagedObject methods }

选项2:"手动/无"

  • 与选项1类似,只是您可以查看和编辑NSManagedObject子类文件.

  • 使用模型编辑器创建希望Core Data管理的实体和关联属性.

  • 在使用NSManagedObject子类生成器之前,请将Codgen选项设置为实体的"Manual/None".Module选项应为Global Namespace.

  • 添加/删除/更新属性后,您有两个选择:(1)手动更新为您生成的NSManagedObject文件或(2)再次使用NSManagedObject子类生成器(这将只更新Entity + CoreDataProperties.swift文件).

  • 同样,如果需要覆盖NSManagedObject中的方法和方法,则可以创建扩展.应在Entity + CoreDataClass.swift文件中创建扩展,而不是Entity + CoreDataProperties.swift文件(由于模型编辑器更改,此文件可能会更新).

    // Optional extension in Entity+CoreDataClass.swift extension Entity { // Override NSManagedObject methods }

选项3:"类别/扩展"

  • 如果您具有不需要由Core Data管理的自定义属性,请使用此选项.

  • 使用模型编辑器创建希望Core Data管理的实体和关联属性.

  • 确保Module选项设置为Current Product Module,Codegen选项设置为"Category/Extension".

  • 使用您将自行管理的属性创建自己的NSManagedObject子类.

  • 不要使用NSMangagedObject子类生成器.Xcode会自动为您生成所需的文件(但它们不会显示在项目导航器中).

    // Subclass NSManagedObject in Entity.swift class Entity: NSManagedObject { // Self managed properties }

    // Optional extension in Entity.swift extension Entity { // Override NSManagedObject methods }

  • 你能进一步了解类别/扩展路径吗?我在数据模型中添加了一个瞬态属性,我不知道如何编辑生成的文件,因为我在左侧文件资源管理器中看不到它们.它们在导入标题时显示,因此必须在某处生成它们. (3认同)

aks*_*hay 40

  1. 要解决此问题,请删除应用程序的派生数据.

  2. 然后将模块更改为当前产品模块,并将Codegen中的更改更改为手动/无.

  3. 项目清单


Dan*_*nko 17

尝试设置CodeGen:手动/无模块:当前产品模块

当我遇到同样的问题时,它对我有用.

在此输入图像描述


小智 10

您可以尝试这些步骤

  1. 在Xocde Project Navigator中选择.xcdatamodeld文件
  2. Data Modul Inspector中,确保Codegen:Manual/None
  3. 然后编辑 - > 创建NSManagedObject子类
  4. 清洁产品并重建

这有用吗?如果不

确保所有实体名称不同.您可以在Build Phases - > Compile Sources中找到这些类.如果类或实体重复,则重命名该类

要么

您可以在项目文件夹中运行此命令以获取更多错误信息

xcodebuild -verbose

当我遇到这个问题时,我收到了这条消息

重复符号_OBJC_CLASS _ $ _ RandomList in:

XXXX/RandomList.o

XXXX/RandomList + CoreDataClass.o

RandomList.hRandomList + CoreDataClass.h在编译时具有相同的符号

我认为为什么Xcode没有警告你,但编译器会抛出错误

希望对你有帮助


Nei*_*tha 7

如果您有遗留应用程序,并且希望手动添加托管对象类

  1. 确保您的核心数据模型codegen设置为Manual/None
  2. 选择核心数据模型文件
  3. 创建托管对象子类

编辑的截图


Law*_*413 6

删除第3个import语句,因为它是空的.

注意:我不知道为什么会发生这种情况,但我想这是Xcode 8中的一个错误.只需删除它就能正常工作.

  • 这适用于.哇...谁是地狱QA的这个东西...... Apple cmon (2认同)

小智 5

Xcode 8.2.1上,我做到了这一点:(感谢Daniel Chepenko)

在此输入图像描述

Xcode 8.2.1会添加一个愚蠢的.进入生成的文件:

在此输入图像描述

只需删除即可.它会运行正确.