CoreData : 경고 : 명명 된 클래스를로드 할 수 없습니다.


94

Xcode 6.1을 사용하여 기존 Objective-C TV Show 앱을 새 Swift 버전으로 복제하고 있으며 CoreData에 몇 가지 문제가 있습니다.

4 개의 엔티티 모델을 만들고 NSManagedObject 하위 클래스 (Swift에서)를 만들었으며 모든 파일에는 적절한 앱 대상이 설정되어 있습니다 ( 'Compile Sources').

새 엔티티를 삽입하려고 할 때마다이 오류가 계속 발생합니다.

CoreData : 경고 : 엔티티 'Shows'에 대해 'Shows'라는 클래스를로드 할 수 없습니다. 클래스를 찾을 수 없습니다. 대신 기본 NSManagedObject를 사용합니다.

몇 가지 의견 :

Core Data에 저장할 때 부모-자식 컨텍스트 방식을 사용하여 백그라운드 스레딩을 허용합니다. 다음을 사용하여 ManagedObjectContext를 설정하여이를 수행합니다.

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()

다음을 사용하여 데이터를 저장합니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
  var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
  context.parentContext = self.managedObjectContext!
  ...rest of core data saving code here...
})

답변:


177

이 경고는 Swift 구현의 세부 사항을 해결하는 동안 처리해야하는 단점 중 하나입니다. 경고는 허위로 발생합니다. 즉, 아래에 설명 된 단계를 따르지 않아도 설정이 작동 할 수 있습니다.

모델 편집기에서 클래스가 올바르게 설정되었는지 확인 하여 대부분의 경우 제거 할 수있었습니다 . 다른 많은 SOF 게시물 (이 질문에 대한 답변 포함)과 달리 모듈 이름 (예 :)을 포함하라는 제안이 도움 MyApp.Shows되지 않았습니다 .

다음 세 가지 항목을 확인하십시오.

1.
Xcode 7 베타 3까지 작동하는 버전

최대 XCode7 b3

귀하의 엔티티 이름을 더 적절한 단수로 수정했습니다.

Xcode 7.1의 Swift 2.0에서 작동하는 버전
(Xcode 7 베타 4 이상에서 작동해야 함)

모듈에서 "현재 제품 모듈"텍스트를 삭제해야합니다!

Xcode7 베타 3에서

2.
또한 빈번한 권장 사항을 따라야합니다.

@objc(Show)

수업 바로 위에.

노트 : Xcode 7 베타 4 이상을 사용하는 경우이 단계는 선택 사항입니다.

3.
또한 생성 된 관리 개체를 적절한 클래스 로 캐스팅 해야합니다 NSManagedObject. 기본값은 .

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", 
                 inManagedObjectContext: context) as Show

3
감사! 권장되는 명명 규칙 업데이트를 수행했으며 'Unable to load class ...'오류를 수정하는 트릭을 수행하는 것으로 보이는 것은 '@objc (Show)'였습니다. 매우 감사!
JimmyJammed

안녕하세요 @Mundi. 정말 고맙습니다! 출처가 어디 있었는지 아직도 기억 하시나요?
iamdavidlam

1
예를 들어이 질문을 참조하십시오 . 무슨 일이 일어나고 있는지 이해하기에 충분한 정보가 있습니다.
Mundi 2014

4
흥미롭게도, 내가했다 제거 @objc(MyClass)
산타 클로스에게

1
@Mundi, 답변을 다시 업데이트하고 싶을 수도 있습니다. khunshan의 답변 업데이트를 참조하십시오.
Suragch

75

SWIFT 2 / XCODE 7 업데이트 :

이 문제 (이 답변에 대한 4 월 3 일 주석 참조)는 Apple의 Swift 2XCode 7 베타 릴리스 에서 해결 되었습니다 . 따라서 실제로 Mundi가 응답하거나 클래스 이름 앞에 " "를 사용하는 Swift 에서는 필요하지 않습니다 . 작동이 중지됩니다. 그래서 이것을 제거 하고 파일 에 이름을 입력 하고 모듈로 선택 하고 응원하십시오!@objc(myEntity)MyAppName.ClassCurrent Working Module

현재 작업 모듈 선택

그러나 사용하는 사람들을 위해 @objc(myEntity) (나와 같은) Swift에서 원활하게 작동하는 다른 솔루션을 대신 사용할 수 있습니다.

xcdatamodel에서 올바른 클래스입니다. 다음과 같이 표시되어야합니다.

수업 설정

여기 있습니다. Module.ClassSwift 및 XCode 6의 CoreData 패턴입니다 . Model Policy 또는 기타 CoreData 항목에서 Custom Policy 클래스를 사용할 때도 동일한 절차가 필요합니다 . 참고 : 이미지에서 이름과 클래스는 Car 및 MyAppName.Car (또는 엔터티의 이름) 여야합니다. 여기에 User오타가 있습니다.


이 솔루션의 문제점은 자동 생성 엔티티 클래스가 더 이상 제대로 작동하지 않는다는 것입니다 (모듈 이름으로 하나의 클래스 만 생성됨). 참조 : 제대로 생성되지 않는 NSManagedObject 하위 클래스 만들기 .
milos

NSManagedObject 엔티티 클래스를 생성 한 후 솔루션을 적용해야합니다. 제거 할 xcode 6.xx 버그 일 것입니다.
khunshan 2015-04-03

2
예, 이것은 의심 할 여지없이 해결 될 것입니다. 자동 생성 된 클래스는 이미 @objc (<엔티티 검사기에 입력 된 클래스 이름>)로 장식되어 있어야합니다. 그렇지 않으면 Apple이이를 시작하지 않아도됩니다.
milos

2
아직도 이것을 읽는 사람들을 위해. ' MyAppName.Car '를 사용 하면 작동하지 않았고 ' MyAppName을 제거하면 작동 했습니다. '부분. 그래서 Car두 필드 모두 트릭을 수행했습니다.
Gideon

1
당신은 챔피언 !!!! let person = NSEntityDescription.insertNewObject (forEntityName : "Person", into : context) as! Person
Abhimanyu Rathore

36

Xcode 7과 순전히 Swift를 사용할 때 실제로 자동 생성 된 하위 클래스 ( > 에서 생성됨)에서 제거 해야했습니다 .@objc(MyClass)NSManagedObjectEditorCreate NSManagedObject Subclass...


4
이 답변을 게시 해 주셔서 감사합니다. 나는 벽에 머리를 부딪 히려고했다.
Zia

여기에 같은 문제-버그를 제출했습니다.
MirekE

나를 위해 일했습니다. 그것을 제거해야했다. 기괴한.
Kent

내 실험에 따르면 오 탐지처럼 보입니다.
Mundi 2015

나는 그것을 제거해야하고 현재 제품 모듈을 설정 만 그것은 일
올렉 셔먼에게

13

Xcode 7 베타 2 (그리고 나는 1을 믿습니다)에서 모델 구성에서 새로운 관리 객체 유형 File이 모듈로 설정 되고 객체의 Current Product Module클래스가 구성에 .File.

Xcode 7에서 "현재 제품 모듈"로 설정된 관리 개체 유형의 모듈

모듈 설정을 삭제하여 공백으로 만들거나 전체 중지를 제거하여 구성의 클래스 이름이 그대로 유지 File되도록하는 것은 각각 다른 변경을 유발하므로 동일한 작업입니다. 이 구성을 저장하면 설명 된 오류가 제거됩니다.

Xcode 7에서 공백으로 설정된 관리 개체의 모듈


9

Xcode 6.1.1에서는 기본 엔티티가 objc 클래스 (NSManagedObject)의 하위 집합이므로 @objc 속성을 추가 할 필요가 없습니다 ( Swift Type Compatibility 참조 . CoreData에서는 전체 Module.Class 이름이 필요합니다. Module을 알고 있어야합니다. name은 빌드 설정-> 패키징-> 제품 모듈 이름에 설정되어 있습니다. 기본적으로이 값은 대상의 이름 이 될 $ (PRODUCT_NAME : c99extidentifier)로 설정됩니다 .


예! 이것이 현대적인 대답입니다 (xcode 6.3.2). 올바른 번들 이름을 사용하는 것이 핵심입니다. 제 경우에는으로 변환 my-product되었고 my_product이로 인해 Core Data에 모든 차이가 생겼습니다.
SimplGy

5

xCode 7 및 Swift 2.0 버전에서는 @objc (NameOfClass)를 추가 할 필요가 없습니다. "Show the Data Model Inspector"탭에서 엔티티 설정을 아래와 같이 변경하면됩니다.

이름- "귀하의 법인 이름"

클래스- "엔티티 이름"

모듈- "현재 제품 모듈"

여기에 이미지 설명 입력

Entity 클래스 파일의 코드는 다음과 같습니다 (내 코드에서 Entity는 Family입니다)-

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}

이 예제는 xCode 7.0 + swift 2.0을 사용하는 내 앱에서 잘 작동합니다.


3

PRODUCT_MODULE_NAME제품 모듈 이름 으로 바꾸는 것을 잊지 마십시오 .

새 엔터티가 생성되면 Data Model Inspector (마지막 탭) PRODUCT_MODULE_NAME로 이동하여 모듈 이름으로 바꿔야 합니다. 그렇지 않으면 class not found영구 저장소 코디네이터를 만들 때 오류가 발생합니다.


2

또한 캐스트를 수행 할 때 (적어도 Xcode 6.3.2와 함께) Module.Class를 사용해야합니다. 모듈 (예 : 제품 이름)이 Food이고 클래스가 Fruit이라고 가정합니다.

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)

let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit

요약 :

  • 데이터 모델 편집기에서 엔티티를 정의 할 때 모듈 이름 포함 (이름 : 과일, 클래스 : Food.Fruit)
  • 코드 (ieSWIFT)에서 엔티티에 액세스 할 때 Module.class (예 : Food.Fruit)로 캐스팅합니다.

감사합니다. 두 번째 요점은 매우 중요합니다. 캐스팅 할 때 "Module.Class"를 사용해야했습니다.
Zoyt 2015 년


1

데이터 모델 편집기에서 항목 클래스 이름을 문제의 클래스에 해당하도록 변경하고 @objc(NameOfClass)클래스 선언 바로 위에있는 각 NSManagedObject의 파일에 추가 하면 단위 테스트 중에이 문제가 해결되었습니다.


0

나를 위해 일한 것은 (Xcode 7.4, Swift) <my actual class name>.<entity name> Entity inspector의 'Class'상자에서 클래스 이름을 변경하는 것 입니다.

Managed 개체 하위 클래스의 내 개시자는 다음과 같습니다.

    convenience init(<properties to init>) {
    let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
    self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
    //init properties here

0

Xcode 11.5의 경우 : Codegen 속성이 클래스 정의이고 xcdatamodel에서 만든 엔터티에 대한 제안을받지 못하는 경우. Xcode를 종료하고 프로젝트를 다시여십시오. 그것은 나를 위해 작동합니다. 이 답변은 제안을 얻지 못했지만 파일이 생성되지 않으면 위의 답변을 시도하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.