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




ابل تحميل (25)

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

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

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


Answers

إذا كان لديك فئة فرعية UIViewController مخصصة مع IBOutlets تسبب في حدوث مشكلات ، فإن المجموعة الوحيدة من الخطوات التي وجدتها للتخلص فعليًا من الخطأ كانت

.1 غيّر الصف إلى UIViewController

.2 اﻓﺻل ﺟﻣﯾﻊ اﻟﻣﻧﺎﻓذ (ﺳﯾﮐون ﻟدﯾﮭم ﺟﻣﯾﻊ ﻣﺛﻟث اﻟﺗﺣذﯾر اﻷﺻﻔر اﻵن) - ﻗد ﯾﮐﻔﻲ ﻓﻘط ﻟﻔﺻل اﻟﻣﻧﻔذ (اﻟﻣﺻﺎدر) اﻟﻣﺷﮐﻟﺔ.

3 القيام بكل الخطوات القياسية - ↑ ⌘K ، حذف البيانات المشتقة (، ماتس الصلاة ، حبات القلق)

4. إطلاق التطبيق - انتقل إلى المشهد إشكالية.

.5 قم باستخراج التطبيق ، ارجع إلى Interface Builder قم بتغيير الفئة إلى اسم الفئة المخصص.

.6 قم بإعادة توصيل المنافذ الخاصة بك.

يمكنك تشغيل التطبيق وهذا سيؤدي عادة إلى حل مشكلات الامتثال للقيمة الرئيسية.


واجهت نفس المشكلة ، وفي حين أن إجابة "تيكزين" قد تكون مذهلة ، وجدت أنه من الصعب تقديمها لحالتي.

في النهاية قمت بحل المشكلة عن طريق ربط التسمية عبر وحدة التحكم المدرجة تحت كائنات (مظللة في الصورة أدناه) بدلاً من ذلك عن طريق مالك الملف .

أتمنى أن يساعدك هذا.


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


هذا الخطأ شيء آخر!

هنا كيف يمكنني إصلاحه. أنا أستخدم إصدار xcode 6.1.1 وباستخدام swift. لقد تلقيت هذا الخطأ في كل مرة حاول فيها تطبيقي إجراء عملية segue للانتقال إلى الشاشة التالية. هنا ما فعلته.

  1. تم التحقق من أن الزر كان متصلاً بالإجراء الصحيح (لم تكن هذه هي المشكلة ، ولكن لا يزال من الجيد التحقق)
  2. تأكد من أن الزر لا يحتوي على أي إجراءات أو منافذ إضافية قد تكون قمت بإنشائها عن طريق الخطأ. (لم تكن هذه هي المشكلة ، ولكن لا يزال من الجيد التحقق)
  3. تحقق من السجلات وتأكد من أن جميع الأزرار الموجودة في الشاشة التالية تحتوي على الإجراءات الصحيحة ، وإذا كان هناك أي فواصل ، فتأكد من أنها تحتوي على معرف فريد. (كانت هذه هي المشكلة)
    • واحد من segues لم يكن لديك معرف فريد
    • كان أحد الأزرار عبارة عن عمل ومخرجين قمت بإنشائهما عن طريق الخطأ.
    • احذف أية منافذ إضافية وتأكد من أن المقاطع إلى الشاشة التالية لها معرفات فريدة.

في صحتك،


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


هناك مشكلة أخرى "غير متوافقة" وجدت عندما تمكنت من الحصول على نسختين من الفصل الدراسي لسبب ما.

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

للعثور على نسخة "صحيحة" استخدمت نقرة cmd لـ XCode على اسم الفئة في مكان آخر للانتقال إلى النسخة الصحيحة ، ثم قتلت النسخ السيئة غير المستخدمة (بعد إحضار تعديلاتي من النسخة غير المستخدمة أولاً).

الأخلاقية من القصة: ملفات الطبقة المكررة سيئة.


"هذه الفئة ليست متوافقة مع مفتاح التشفير الرئيسي للمفتاح" أعرف أنه متأخر قليلاً ولكن إجابتي مختلفة لذا أعتقد أنه يجب نشرها ، كنت أدفع جهاز التحكم الثاني بطريقة خاطئة ، وإليك عينة

طريقة خاطئة لدفع المراقب المالي

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

طريقة صحيحة

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

لم أجد أي إجابة مثل ما سبق ، لذا قد يكون من الممكن أن يساعد بعض الأشخاص في الحصول على نفس المشكلة


قد يكون لديك وحدة تحكم العرض فئة غير صحيحة في xib الخاص بك.

لقد قمت بتنزيل مشروعك.

الخطأ الذي تحصل عليه هو

'NSUnknownKeyException' ، السبب: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: هذه الفئة ليست مفتاحًا ترميزًا لقيمة سلسلة المفاتيح.'

وهو يحدث بسبب وحدة تحكم العرض Second في MainWindow.xib وجود فئة من SecondView بدلاً من SecondView . تغيير إلى الفئة الصحيح يحل المشكلة.

بالمناسبة ، من الممارسات السيئة وجود أسماء مثل "string" في Objective-C. وهو يدعو لتصادم تسمية وقت التشغيل. تجنبها حتى في وقت واحد من التطبيقات الممارسة. يمكن أن يكون من الصعب جدًا تتبع التصادمات في التسمية ، ولا ترغب في إضاعة الوقت.

سبب آخر محتمل لهذا الخطأ: عند نسخ العناصر ولصقها من وحدة تحكم إلى أخرى ، يحتفظ Xcode بطريقة ما بهذا الرابط إلى وحدة التحكم الأصلية ، حتى بعد تحرير وإعادة ربط هذا العنصر في وحدة التحكم الجديدة.


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


اضطررت إلى حذف التطبيق من جهاز محاكاة / iPhone للتخلص من هذا الخطأ.


كان لدي مشكلة مماثلة لمشروع يحتوي على هدفين (مع MainWindow XIB الخاصة بهم). كانت المشكلة الأساسية التي تسببت في هذا الخطأ بالنسبة لي هي أن فئة UIViewController لم يتم تضمينها في قائمة موارد المشروع الثاني. سمح لي باني واجهة لتحديده في MainWindow.xib ، ولكن في وقت التشغيل لم يتمكن النظام من تحديد موقع الطبقة.

أي كمد انقر فوق فئة UIViewController المعنية وتأكد مرة أخرى من تضمينها في علامة التبويب "الأهداف".


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


إذا كان تطبيق iPhone فقط ، وليس تطبيقًا عالميًا ، فتأكد من أن الحقل التالي فارغ:

الأهداف> الملخص> iPhone / iPod Deployment Type> Main Interface

إذا قمت بتحديد xib هناك تعطل.


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


في حالتي كان خطأ في شفرة مصدر القصة المصورة ، اتبع الخطوات التالية:

  1. افتح لوحة القصة أولاً كرمز مصدر
  2. ابحث عن <connections>
  3. إزالة الاتصالات غير المرغوب فيها

فمثلا:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

كما ترون ، هذه هي الروابط بين أسماء متغيرات التعليمات البرمجية الخاصة بك وعلامات xml تخطيط لوحة القصة؛)


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

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

  1. تحتاج فقط إلى تحديد IBOutlet مرة واحدة ، IBOutlet الخاص بك تسمية ivar غير ضروري.
  2. هل تقوم بإنشاء حسابك لدى بنك الاستثمار القومي باستخدام UIViewController ؟ في مرحلة ما ، يجب أن تتصل بـ [SecondView initWithNibName:@"yourNibName" bundle:nil];

كان لي بالضبط نفس رسالة الخطأ وشكرا (!) لكيرا من http://www.idev101.com كنت قادرا على حل التحدي. لقد عثرت على موقعها فقط بعد googling و stacking فوق كل هذه المواضيع. أنا الآن نشر هنا من أجل التالي الذي يأتي إلى ولديه نفس التحدي الذي كان لدي منذ ذلك الشخص على الأرجح سيأتي إلى هذا الموضوع عبر جوجل.

أدركت أنني قمت بهذا الخطأ:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

بدلا من هذا:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

أين

DeviceViewController

كان اسم صفي يعرف أيضا باسم

DeviceViewController.h 
DeviceViewController.m

عليك أن

"import DeviceViewController.h"

في تطبيقك (ملف .m) حيث تريد الاتصال على سبيل المثال ، UIViewController آخر.

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

ملاحظة: للراغبين في كيفية متابعة التعليمة البرمجية لتحميل UIViewController الآخر:

    [self presentViewController:deviceViewController animated:YES completion:nil];

يحدث هذا لي عندما يكون جهاز تحكم العرض الخاص بي في الأصل ملف .xib ، ولكن الآن يتم إنشاؤه بطريقة برمجية.

على الرغم من أنني قمت بحذف ملف .xib من هذا المشروع. قد يحتوي مستخدمو iPhone / iPad على ملفات .xib لمساعد العرض هذا.

تؤدي محاولة تحميل ملف .xib عادةً إلى حدوث هذا العطل:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

الحل عند إنشائه برمجيا قد يكون هذا:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}

لقد تلقيت هذه المشكلة في مشروعي المكرر وتم حلها عن طريق التحقق من مكانين:

1- تأكد من وجود ملف .m في القائمة -> Project - Build Phases - Compile Sources
2- بعد ذلك ، انتقل إلى أداة إنشاء الواجهة (ربما يحدث خطأ في IB فقط) وإلغاء ربط جميع الخصائص والتصنيفات والصور وما إلى ذلك ... ثم أعد ربط الكل. لقد أدركت أنني قمت بإزالة سمة ولكن كان لا يزال مرتبطًا في IB.

آمل أن يعمل لبعض.


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


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

لتصحيح ذلك:

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

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


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

كنت أعمل على ترميز خدمة ويب في 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

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


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


كنت أواجه مشكلة مماثلة. لقد قمت بتغيير الحقول المطلوبة من قبل المستخدم وإعادة تسمية اثنين من المجالات.

لقد أجريت جميع التغييرات اللازمة في التحليل (أعمدة مضافة وإضافتها). الخلفية ليست هي المشكلة.

لا يزال رمز مصدر منشئ واجهة المستخدم يحتوي على السمات القديمة.

لحل حق انقر على main.storyboard -> فتح باسم -> رمز المصدر .... ابحث عن الحقول التي قمت بإزالتها أو إعادة تسميتها ... حذف أو تعديلها ... ذلك يعتمد التغييرات التي قمت بها.

في حالتك قمت بإعادة تسمية LoadMethod من شيء آخر؟

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

في صحتك!





ios macos cocoa cocoa-touch interface-builder