ios - غير قادر على العثور على فئة فرعية معينة من NSManagedObject




core-data swift (12)

أعمل على تطوير تطبيق باستخدام Core Data. عندما قمت بإنشاء مثيل باستخدام:

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؟

تصحيح:

لقد حددت فئة الكيان كما في لقطة الشاشة التالية:


Answers

بالمناسبة ، كن حذرًا ما تضيفه كبادئة: يسمى تطبيقي "ABC-def" ، وتحول Xcode إلى "-" إلى "_".

لتكون نظرة آمنة في مكتشف ، والعثور على ملفات المشروع الخاص بك ونرى ما تقوله لنموذج البيانات الخاصة بك (على سبيل المثال "ABC_def.xcdatamodeld") واستخدام ما هو مكتوب هناك بالضبط!


الإجابات المذكورة أعلاه كانت مفيدة. قد يوفر لك هذا الاختيار من سلامة العقل بعض الوقت. انتقل إلى المشروع> إنشاء المراحل> تجميع المصادر وإزالة xcdatamodeld وملفات النماذج الخاصة بك باستخدام الزر "-" ، ثم إضافتها مباشرة بالزر "+". إعادة البناء - التي قد تعتني بها.


ساعدت الإجابات المذكورة أعلاه على حل مشكلة مختلفة مرتبطة بـ Objective-C (ربما ستساعد شخصًا ما):

إذا قمت بإعادة تشكيل أسماء الكيانات ، فلا تنس تغيير "Class" في "Utilities Panel" أيضًا.


الإجابات المذكورة أعلاه ساعدتني لكن هذا قد يساعد شخص ما. إذا كنت مثلك فعلتها وما زالت تواجه مشكلة ، تذكر ببساطة "تنظيف مشروعك". للحصول على XCode8 ، المنتج> تنظيف. ثم قم بتشغيل مرة أخرى.


إذا كنت تستخدم واصلة في اسم مشروعك مثل "My-App" ، فاستخدم تسطير أسفل السطر بدلاً من الواصلة مثل "My_App.MyManagedObject". بشكل عام ، انظر إلى اسم ملف xcdatamodeld واستخدم نفس البادئة كما في هذا الاسم. يتطلب "My_App_1.xcdatamodeld" البادئة "My_App_1"


كان لي نفس التحذير ، على الرغم من أن تطبيقي بدا يعمل بشكل جيد. كانت المشكلة عند تشغيل محرر> إنشاء فئة فرعية NSManagedObject على الشاشة الأخيرة استخدمت موقع المجموعة الافتراضي ، مع عدم عرض Targets أو التحقق منها ، والتي حفظت الفئة الفرعية في أعلى دليل MyApp حيث تم وضع MyApp.xcodeproj.
انتهى التحذير عندما غيّرت المجموعة بدلاً من ذلك لتكون في مجلد MyApp الفرعي وفحصت هدف MyApp.


تذكر إزالة الوحدة النمطية الخاصة بك:


تحديث لـ Xcode 7 (نهائي): لم يعد من الضروري إدخال اسم الوحدة النمطية للفئة (كما هو الحال في Xcode 6 والإصدارات التجريبية المبكرة من Xcode 7). تم تحديث وثائق Apple Apple Application Core Subaged Framework للبيانات الأساسية وفقًا لذلك.

لدى مفتش نموذج البيانات الآن حقلين "صنف" و "وحدة" للكيان:

عند إنشاء فئة فرعية لكائن تتم إدارته بواسطة Swift للكيان ، يتم تعيين حقل "الوحدة النمطية" إلى "وحدة نمطية المنتج الحالية" ، ومع هذا الإعداد ، تعمل المثيلات في كلا التطبيقين الرئيسيين وفي اختبارات الوحدة. يجب ألا يتم وضع علامة على الفئة الفرعية للكائنات المدارة بـ @objc(classname) (تمت ملاحظة ذلك في https://.com/a/31288029/1187415 ).

بدلاً من ذلك ، يمكنك إفراغ حقل "الوحدة النمطية" (سيظهر "بلا") ووضع علامة على الفئات الفرعية للكائنات المدارة بـ @objc(classname) (تمت ملاحظة ذلك في https://.com/a/31287260/1187415 ).

ملاحظة: تمت كتابة هذه الإجابة في الأصل عن Xcode 6. حدثت بعض التغييرات في الإصدارات التجريبية Xcode 7 المختلفة فيما يتعلق بهذه المشكلة. نظرًا لأنه جواب مقبول مع العديد من المواقف والروابط إليه ، فقد حاولت تلخيص الموقف لإصدار Xcode 7 النهائي الحالي.

فعلت كل من "البحث" الخاص بي وقراءة جميع الإجابات على كل من هذا السؤال وسؤال مماثل CoreData: تحذير: غير قادر على تحميل فئة المسمى . لذا ، تنسب الإحالة إليهم جميعًا ، حتى إذا لم أذكرهم على وجه التحديد!

الإجابة السابقة لـ Xcode 6 :

كما هو موثق في تطبيق Subclasses للطبقة الأساسية للبيانات المدارة ، يجب عليك بادئة اسم فئة الكيانات في الحقل Class في مفتش كيان النموذج باسم الوحدة الخاصة بك ، على سبيل المثال "MyFirstSwiftApp.User".


هذا قد يساعد أولئك الذين يعانون من نفس المشكلة. كنت ، مع سويفت 2 و Xcode 7 بيتا 2.

كان الحل في حالتي هو التعليق على @objc(EntityName) في EntityName.swift .


ساعدني الجواب المقبول على هذا السؤال في حل نفس المشكلة ولكن كان لدي تحذير بأنني أعتقد أنه سيكون مفيدًا للآخرين. إذا كان اسم مشروعك (وحدة نمطية) يحتوي على مسافة فيه ، فيجب استبدال المساحة بشرطة سفلية. فمثلا:

الكيان: MyEntity فئة: My_App_Name.MyClass


استنادًا إلى ما إذا كنت تعمل بنظام التشغيل مقابل الاختبارات ، يمكن أن تتمثل المشكلة في أن التطبيق يبحث عن <appName>.<entityName> وعندما يتم تشغيله كاختبار ، يبدو أنه <appName>Tests.<entityName> . الحل الذي أستخدمه في هذا الوقت (Xcode 6.1) هو عدم ملء حقل Class في واجهة مستخدم CoreData ، وإجراء ذلك في الكود بدلاً من ذلك.

managedObjectClassName هذا الرمز ما إذا كنت تعمل كـ App vs Tests واستخدم اسم الوحدة النمطية الصحيح وقم بتحديث الـ 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
}()

ما عمل لي (Xcode 7.4، Swift) هو تغيير اسم الفئة إلى <my actual class name>.<entity name> في مفتش الكيان ، مربع "الفصل".

يبدو بادئي للفئة الفرعية للكائنات المدارة كما يلي:

    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






ios core-data swift nsmanagedobject