Saya sedang mengembangkan aplikasi dengan Core Data. Ketika saya membuat sebuah instance menggunakan:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Saya mendapat peringatan di log:
CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead.
Bagaimana saya bisa memperbaikinya?
Dan pertanyaan lain, bagaimana saya bisa mendefinisikan metode contoh di subclass NSManagedObject?
Edit:
Saya telah menentukan kelas entitas seperti pada tangkapan layar berikut:
ios
core-data
swift
nsmanagedobject
MsrButterfly
sumber
sumber
Jawaban:
Pembaruan untuk Xcode 7 (final): Mempersiapkan nama modul ke kelas (seperti di Xcode 6 dan rilis beta awal Xcode 7) tidak lagi diperlukan. Dokumentasi Apple yang Mengimplementasikan Subkelas Objek Terkelola Data Inti telah diperbarui sebagaimana mestinya.
Pemeriksa Model Data sekarang memiliki dua kolom "Kelas" dan "Modul" untuk entitas:
Saat Anda membuat subkelas objek terkelola Swift untuk entitas tersebut, kolom "Module" disetel ke "Current Product Module", dan dengan setelan ini, pembuatan instance berfungsi baik di aplikasi utama maupun dalam pengujian unit. Subkelas objek terkelola tidak boleh ditandai dengan
@objc(classname)
(ini diamati di https://stackoverflow.com/a/31288029/1187415 ).Atau, Anda dapat mengosongkan bidang "Modul" (ini akan menampilkan "Tidak Ada") dan menandai subkelas objek terkelola dengan
@objc(classname)
(ini diamati di https://stackoverflow.com/a/31287260/1187415 ).Catatan: Jawaban ini awalnya ditulis untuk Xcode 6. Ada beberapa perubahan dalam berbagai rilis Xcode 7 beta sehubungan dengan masalah ini. Karena ini adalah jawaban yang diterima dengan banyak suara positif dan tautan ke sana, saya telah mencoba meringkas situasi untuk versi final Xcode 7 saat ini.
Saya melakukan "penelitian" saya sendiri dan membaca semua jawaban untuk pertanyaan ini dan pertanyaan serupa CoreData: peringatan: Tidak dapat memuat nama kelas . Jadi atribusi berlaku untuk semuanya, meskipun saya tidak mencantumkannya secara spesifik!
Jawaban sebelumnya untuk Xcode 6 :
Seperti yang didokumentasikan dalam Menerapkan Subkelas Objek Terkelola Data Inti , Anda harus mengawali nama kelas entitas di bidang Kelas di inspektur entitas model dengan nama modul Anda, misalnya "MyFirstSwiftApp.User".
sumber
@objc(ClassName)
metode yang disarankan dalam jawaban Christer.Hanya sebagai catatan samping. saya memiliki masalah yang sama. Dan yang harus saya lakukan hanyalah menambahkan
@objc(ClassName)
file kelas saya.Contoh:
@objc(Person) class Person { }
Dan itu memecahkan masalah saya.
sumber
Jawaban yang diterima untuk pertanyaan ini membantu saya menyelesaikan masalah yang sama tetapi saya memiliki peringatan yang menurut saya akan membantu orang lain. Jika nama proyek (modul) Anda memiliki spasi di dalamnya, Anda harus mengganti spasi dengan garis bawah. Sebagai contoh:
Entitas: Kelas MyEntity: My_App_Name.MyClass
sumber
Ingatlah untuk menghapus modul Anda :
sumber
Bergantung pada apakah Anda menjalankan App vs Test, masalahnya mungkin adalah aplikasi yang dicari
<appName>.<entityName>
dan saat dijalankan sebagai pengujian, tampilannya akan seperti itu<appName>Tests.<entityName>
. Solusi yang saya gunakan saat ini (Xcode 6.1) adalah TIDAK mengisiClass
bidang di UI CoreData, dan melakukannya dalam kode.Kode ini akan mendeteksi jika Anda menjalankan App vs Tests dan menggunakan nama modul yang benar dan memperbarui
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 }()
sumber
Jika Anda menggunakan tanda hubung dalam nama proyek Anda seperti "Aplikasi-Saya", gunakan garis bawah dan bukan tanda hubung seperti "My_App.MyManagedObject". Secara umum, lihat nama file xcdatamodeld dan gunakan awalan yang sama seperti pada nama itu. Yaitu "My_App_1.xcdatamodeld" membutuhkan awalan "My_App_1"
sumber
Ini dapat membantu mereka yang mengalami masalah yang sama. Saya dulu, dengan Swift 2 dan Xcode 7 beta 2.
Solusi dalam kasus saya adalah untuk komentar
@objc(EntityName)
diEntityName.swift
.sumber
Saya mendapat peringatan yang sama, meskipun aplikasi saya tampak berjalan dengan baik. Masalahnya adalah saat menjalankan Editor> Buat Subkelas NSManagedObject di layar terakhir saya menggunakan lokasi Grup default, tanpa Target yang ditampilkan atau dicentang, yang menyimpan subkelas di direktori MyApp atas tempat MyApp.xcodeproj berada.
Peringatan itu hilang ketika saya malah mengubah Grup menjadi di subfolder MyApp dan memeriksa target MyApp.
sumber
Jawaban di atas sangat membantu. Pemeriksaan kewarasan cepat ini dapat menghemat waktu Anda. Masuk ke Project> Build Phases> Compile Sources dan hapus xcdatamodeld dan file model Anda dengan tombol "-", lalu tambahkan kembali dengan tombol "+". Bangun kembali - itu mungkin bisa menangani itu.
sumber
Omong-omong, berhati-hatilah dengan apa yang Anda tambahkan sebagai awalan: Aplikasi Saya disebut "ABC-def" dan Xcode telah mengubah "-" menjadi "_".
Untuk amannya, lihat finder, temukan file proyek Anda dan lihat apa yang tertulis untuk model data Anda (misalnya "ABC_def.xcdatamodeld") dan gunakan apa yang tertulis di sana PERSIS !!!
sumber
Jawaban di atas membantu saya menyelesaikan berbagai masalah yang terkait dengan Objective-C (mungkin itu akan membantu seseorang):
Jika Anda memfaktorkan ulang nama entitas, jangan lupa untuk mengubah "Kelas" di "Panel Utilitas" juga.
sumber
Jawaban di atas membantu saya tetapi ini dapat membantu seseorang. Jika seperti saya, Anda melakukannya dan masih mengalami masalah, ingatlah untuk 'membersihkan proyek Anda'. Untuk XCode8, Produk> Bersihkan. Lalu lari lagi.
sumber
Di Xcode 7 Entitas dan nama Kelas bisa sama tetapi Codegen harus Definisi Kelas. Dalam hal ini tidak akan ada peringatan dll.
sumber