programing

NSManagedObject의 특정 하위 클래스를 찾을 수 없습니다.

closeapi 2023. 5. 26. 20:58
반응형

NSManagedObject의 특정 하위 클래스를 찾을 수 없습니다.

저는 코어 데이터로 앱을 개발하는 일을 하고 있습니다.다음을 사용하여 인스턴스를 생성한 경우:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)

로그에 경고가 기록되었습니다.

CoreData: warning: Unable to load class named 'User' for entity 'User'.  Class not found, using default NSManagedObject instead.

어떻게 고칠 수 있을까요?

그리고 또 다른 질문은 NSManagedObject 하위 클래스에서 인스턴스 메서드를 어떻게 정의할 수 있습니까?

편집:

다음 스크린샷과 같이 엔티티 클래스를 지정했습니다.

여기에 이미지 설명 입력

Xcode 7(최종)에 대한 업데이트:클래스에 모듈 이름을 추가할 필요가 없습니다(Xcode 6 및 Xcode 7의 초기 베타 릴리스에서처럼).이에 따라 Apple 문서 Implementing Core Data Managed Object Subclasss가 업데이트되었습니다.

이제 데이터 모델 검사기에는 엔티티에 대한 두 개의 필드 "클래스"와 "모듈"이 있습니다.

여기에 이미지 설명 입력

엔티티에 대해 Swift 관리 개체 하위 클래스를 생성하면 "모듈" 필드가 "현재 제품 모듈"로 설정되며, 이 설정으로 인스턴스 생성은 기본 응용 프로그램과 장치 테스트 모두에서 작동합니다.관리 개체 하위 클래스는 다음으로 표시할 수 없습니다.@objc(classname)(이는 https://stackoverflow.com/a/31288029/1187415) 에서 관찰되었습니다.

또는 "모듈" 필드를 비우고("없음"으로 표시됨) 관리 개체 하위 클래스를 다음으로 표시할 수 있습니다.@objc(classname)(이는 https://stackoverflow.com/a/31287260/1187415) 에서 관찰되었습니다.


비고: 이 답변은 원래 Xcode 6용으로 작성되었습니다.이 문제와 관련하여 다양한 Xcode 7 베타 릴리스에 몇 가지 변경 사항이 있었습니다.많은 업데이트와 링크가 있는 승인된 답변이기 때문에 현재 Xcode 7 최종 버전에 대한 상황을 요약하려고 했습니다.

저는 직접 "조사"를 하고 이 질문과 유사한 질문에 대한 모든 답변을 읽었습니다. CoreData: warning: 명명된 클래스를 로드할 수 없습니다.그래서 제가 그들을 구체적으로 열거하지 않더라도, 그들 모두에게 귀속됩니다!


Xcode 6에 대한 이전 답변:

핵심 데이터 관리 개체 하위 클래스 구현에서 설명한 대로 모델 엔터티 검사기의 클래스 필드에 있는 엔터티 클래스 이름 앞에 모듈 이름(예: "MyFirstSwiftApp")을 붙여야 합니다.사용자".

그냥 참고로.저도 같은 문제가 있었습니다.그리고 내가 해야 할 일은@objc(ClassName)우리 반 파일에.

예:

@objc(Person)
class Person { }

그리고 그것이 제 문제를 해결했습니다.

이 질문에 대한 수락된 답변은 제가 같은 문제를 해결하는 데 도움이 되었지만, 저는 다른 사람들에게 도움이 될 것이라는 경고를 받았습니다.프로젝트(모듈) 이름에 공백이 있는 경우 공백을 밑줄로 대체해야 합니다.예:

엔티티: MyEntity 클래스: My_App_Name.나의 수업

모듈을 제거해야 합니다.

여기에 이미지 설명 입력

일 수 있습니다.<appName>.<entityName>▁as다▁and보니입▁it'▁as같처럼 보입니다.<appName>Tests.<entityName>현재 사용하는 솔루션(Xcode 6.1)은 다음을 채우지 않는 것입니다.Class필드를 사용하여 코드로 수행할 수 있습니다.

하고 "" " " " 를 합니다.managedObjectClassName.

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional...
    let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")!
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    // Check if we are running as test or not
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

    // Create the module name
    let moduleName = (isTest) ? "StreakTests" : "Streak"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    return newManagedObjectModel
}()

프로젝트 이름에 "My-App"과 같은 하이픈을 사용하는 경우 "My_App"과 같은 하이픈 대신 밑줄을 사용합니다."내 관리 개체"입니다.일반적으로 xcdatamodeld 파일의 이름을 보고 해당 이름과 동일한 접두사를 사용합니다.즉, "My_App_1.xcdatamodeld"에는 접두사 "My_App_1"이 필요합니다.

이것은 같은 문제를 겪고 있는 사람들에게 도움이 될 수 있습니다.저는 스위프트 2와 Xcode 7 베타 2를 사용했습니다.

경우의 해결책은 논평하는 것이었습니다.@objc(EntityName)EntityName.swift.

위의 답변이 도움이 되었습니다.이 빠른 제정신 검사는 시간을 절약할 수 있습니다.프로젝트 > 빌드 단계 > 소스 컴파일로 이동하여 "-" 버튼으로 xcdata model 및 모델 파일을 제거한 후 "+" 버튼으로 바로 추가합니다.재구축 - 처리할 수 있습니다.

제 앱이 정상적으로 실행되는 것처럼 보였지만, 저는 같은 경고를 받았습니다.문제는 마지막 화면에서 Editor > Create NSManagedObject Subclass를 실행할 때 Targets가 표시되거나 선택되지 않은 기본 Group 위치를 사용하여 MyApp.xcodeproj가 있는 상단 MyApp 디렉토리에 서브클래스를 저장했다는 것입니다.
대신 그룹을 MyApp 하위 폴더로 변경하고 MyApp 대상을 확인했을 때 경고가 사라졌습니다.

그런데 접두사로 추가하는 것을 주의하세요: 제 앱은 "ABC-def"라고 하며 Xcode는 "-"를 "_"로 변환했습니다.

파인더를 안전하게 조사하려면 프로젝트 파일을 찾아서 데이터 모델에 대해 무엇이 쓰여 있는지 확인하고(예: "ABC_def.xcdatamodeld") 거기에 쓰여 있는 것을 정확히 사용하십시오!!!

위의 답변은 목표-C와 관련된 다양한 문제를 해결하는 데 도움이 되었습니다(아마도 누군가에게 도움이 될 것입니다).

엔티티 이름을 리팩터링한 경우 "유틸리티 패널"에서도 "클래스"를 변경하는 것을 잊지 마십시오.

위의 답변들은 나에게 도움이 되었지만 이것은 누군가에게 도움이 될 수 있습니다.저처럼 작업을 수행했지만 여전히 문제가 있는 경우에는 단순히 '프로젝트를 정리'하는 것을 기억하십시오.XCode8의 경우 제품 > Clean.그리고 다시 뛰어요.

Xcode 7에서 엔티티와 클래스 이름은 동일할 수 있지만 Codegen은 클래스 정의여야 합니다.이 경우 경고 등이 발생하지 않습니다.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/25076276/unable-to-find-specific-subclass-of-nsmanagedobject

반응형