[ios] ماذا يعني هذا؟ "NSUnknownKeyException" ، والسبب: ... هذه الفئة ليست قيمة أساسية متوافقة مع التشفير للمفتاح X "



14 Answers

قد يكون لديك اتصال سيء في xib الخاص بك.

لقد كان هذا الخطأ عدة مرات. على الرغم من أن إجابة TechZen صحيحة تمامًا في هذه الحالة ، فإن هناك سبب آخر شائع وهو تغيير اسم خاصية IBOutlet في .h / .m التي قمت بالتوصيل بها بالفعل إلى مالك الملف في nib.

من طرفك:

  1. حدد الكائن في IB وانتقل إلى "مفتش اتصالات".
  2. ضمن "Referencing Outlets" تأكد من أن الكائن الخاص بك لا يزال متصلاً باسم الخاصية القديم ... إذا كان موجودًا ، انقر فوق "x" صغير لحذف المرجع وإعادة الإنشاء.

سبب آخر شائع إذا كنت تستخدم Storyboard ، قد يكون لديك UIButton أكثر من تعيينات واحدة (الحل هو نفسه تقريبا كما هو الحال بالنسبة لبنك الاستثمار القومي):

  1. افتح لوحة العمل الخاصة بك وانقر بزر الماوس الأيمن على UIButton
  2. سترى أن هناك أكثر من تعيين / إعادة تعيين لهذا الزر. إزالة أحد النوافذ "الرئيسية ..." باللون الرمادي مع "x" الصغيرة:

Question

أحاول ربط UILabel مع UILabel تم إنشاؤها في صفي.

تعطل التطبيق الخاص بي مع الخطأ التالي. ماذا يعني هذا؟ كيف يمكنني إصلاح ذلك؟

*** إنهاء التطبيق نظرًا لحدوث عدم اكتشاف "NSUnknownKeyException" ، السبب: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: هذه الفئة ليست مفتاحًا ترميزًا متوافقًا مع المفتاح XXX.'




بالنظر إلى الإجابات الأخرى ، يبدو أن هناك الكثير من الأشياء التي يمكن أن تسبب هذا الخطأ. هنا واحد أكثر.

اذا أنت

  • لديك وجهة نظر مخصصة
  • أضاف خاصيةInInspectable
  • ثم حذفها في وقت لاحق

ثم قد تحصل أيضا على خطأ مماثل ل

فشل في تحديد الخاصية التي تم تعريفها بواسطة المستخدم (xxx) على [طريقة العرض المخصصة الخاصة بك] ...: هذه الفئة ليست متوافقة مع مفتاح القيمة للمفتاح [xxx].

الحل هو حذف الخاصية القديمة.

افتح مفتش الهوية لفصلك ، وحدد اسم الخاصية تحت سمات خاصية معرفة من قبل المستخدم ، واضغط على زر الطرح (-).




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

كنت أعمل على ترميز خدمة ويب في Swift 2. كنت قد بنيت جميع الكائنات وكيل وكيل اللازمة. أثناء تحليلي عبر XML الذي تم NSObject ، setValue:forKey الكائنات الخاصة بي بشكل ديناميكي ، والتي جاءت جميعها من NSObject وباستخدام setValue:forKey عليها. في كل مرة setValue:forKey حاول تعيين خاصية فجرها مع هذا الخطأ.

كان لديّ بيان تبديل لكل نوع كنت أتعامل معه (مثل Bool? CShort? String? ) ولكل عقدة XML مررت ودققت ما هو النوع الموجود على الكائن ثم قمت بتحويل القيمة إلى هذا النوع وحاولت setValue:forKey مع setValue:forKey .

في النهاية بدأت بالتعليق على كل هذه setValue:forKey lines ووجدت أن ملفي الخاص بتبديل المفتاح default نجح في String? .

لقد برزت أخيرا أنه لا يمكنك استخدام أنواع سويفت اختيارية مع setValue:forKey إلا إذا كان لديهم تعيين مباشر لنوع Objective-C مثل String? أو NSNumber? . انتهى بي الأمر تغيير جميع CShort? أنواع NSNumber? لأن هذا لديه رسم الخرائط المباشر. Bool? في حالتي كان من الجيد بالنسبة لي مجرد استخدام Bool وتهيئته إلى false . البعض الآخر قد لا يكون هذا الترف.

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

لذلك ، أخيراً ، أكّد مرة أخرى أن التشفير بالقيمة الأساسية لا يعمل مع الاختيارات. أدناه انتهى بي الأمر إلى إيجاد مكان ما ولكنني أنسى أين كان ذلك الشخص الذي نشر هذا الاعتذار وأقدم الفضل إذا تذكرت المكان الذي وجدته فيه ولكنه أنقذ حياتي:

لا يمكنك استخدام KVC على خاصية Int اختيارية ، لأن KVC هو Cocoa / Objective-C ، و Objective-C لا يمكن رؤية Int اختياري - لا يتم توصيله إلى Objective-C. لا يمكن لـ Objective-C سوى رؤية الأنواع التي يتم جسرها إلى Objective-C:

أنواع الفصول الدراسية المشتقة من NSObject

أنواع الصفوف التي تتعرض لهاobjc

الهياكل السريعة التي يتم جسرها




في حالتي. لم يكن لديّ منافذ مفقودة في ملفات xib بعد الدمج.

Shift + Command + K

حل مشكلتي. قمت بتنظيف مشروعي وإعادة بنائه.




أحيانًا ما يتعلق هذا بـ "Inherit From Target" الذي يجب تعيين القيمة. باستخدام التطبيقات المستهدفة الوحيدة ، يمكنك فقط تحديد Inherit From Target. إذا كان لديك أكثر من هدف واحد حدد الهدف المطلوب.




كان هذا يحدث لي فقط عند تصحيح الأخطاء على جهاز (iPhone). كان iOS Simulator يعمل بشكل جيد. يبدو أن القيام بـ "منتج-> تنظيف" من Xcode يحل المشكلة ، ولكن ليس لدي أي فكرة عن السبب.




قد يكون هذا هو حالة الرجوع إلى أحد المكونات من واجهة Xib التي قمت بإعادة تسميتها أو حذفها. إعادة الإحالة تعمل بالنسبة لي.




في حالتي ، كان السبب في ذلك هو الإشارة إلى Nib غير الصحيح:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];



قد تختلف خاصية "الوحدة النمطية" الخاصة بـ View Controller في Identity Inspector عن الذي توقعته. تأكد أيضًا من إضافة فئات جديدة إلى قائمة الأهداف الخاصة بك.




كان عندي هذا الخطأ عندما كنت أحاول تنفيذ ViewCell مخصص لجدول. عندما أبرزت عرض المراقب المالي ل XIB وتوصيله بالعناصر في CellView تسبب في الخطأ "هذه الفئة ليست المفتاح قيمة التشفير المتوافقة للمفتاح" بمجرد حذف هذه أنها تخلصت من الخطأ.

حذف الاتصالات في الصورة أدناه.

فقط تأكد من أن لديك فقط اتصالات مع خلية عرض الجدول. للتحقق انقر فوق خلية عرض الجدول وفي INSPECTOR ابحث عن اتصالاتك.




كان لي نفس الأعراض. السبب الرئيسي هو أن "العضوية المستهدفة" لملفي المصدر لم يتم ضبطها على الهدف الصحيح. أفترض أن ذلك يعني أن فصلي لن يتم إنشاؤه وتضمينه في تطبيقي.

لتصحيح ذلك:

  1. قم بتمييز ملف .m الخاص بك.
  2. في الجزء الأيسر ، حدد File Inspector.
  3. ضمن قسم "Target Target" ، تأكد من تحديد هدف الإنشاء المناسب.

آمل أن يساعد هذا شخص ما هناك.




كان الإصلاح الخاص بي مشابها لجيرارد جراندي. في إنشاء UITableViewCell مخصص باستخدام XIB ، قمت بطريق الخطأ بتطبيق اسم الفئة المخصصة لمالك الملف بدلاً من UITableViewCell. تطبيق الطبقة على UITableViewCell على القماش وتوصيل خصائص IBOutlet به إلى حل المشكلة.




يمكن أن تأتي من حقيقة أن لديك السيطرة جر و إنشاء منفذ أو عمل ، ونسيت لحذفه. حتى إذا قمت بحذف الرمز ، أو حتى إذا قمت بعمل ما يكفي من cmd + Z ، فستحتاج إلى الذهاب إلى مفتش الاتصال في لوحة العمل ومعرفة ما إذا كان الإجراء أو المخرج الذي قمت بإنشائه ما زال هنا أم لا.




يشير هذا الخطأ إلى أنه تمت إزالة / إعادة تسمية كائن منشئ واجهة المستخدم بالفعل في مصدر مالكه (مالك الملف).

انقر مع الضغط على Control على مالك الملفات في Interface Builder إذا رأيت علامة التعجب تحتاج إلى إصلاح ذلك.

في الصورة أدناه ، يمكنك رؤية أن "aRemovedView" لديه علامة تعجب على اليمين ، وذلك لأنني أزلت كائن عرض IBOutlet أثناء اتصاله في المكتب الدولي.

هذا يعطي الخطأ التالي: إنهاء التطبيق بسبب استثناء غير معلوم 'NSUnknownKeyException' ، السبب: '[setValue: forUndefinedKey:]: هذه الفئة ليست مفتاحًا ترميزًا لقيمة المفتاح aRemovedView.'




حصلت على نفس المشكلة. فعلت إعادة تعيين جهاز محاكاة. إزالة وإضافة زر التحكم. وأخيرا جعل نظيفة. :) بفضل الفائض كومة. بعض كيف أصبحت شفرتي موافق وبدء العمل.






Related