يتعطل تطبيق iPhone مع NSUnknownKeyException setValue:forUnifiedKey:[ينسخ]

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

سؤال

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

أحصل على الخطأ التالية:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage هنا هي الصورة التي أستخدمها للخلفية.

لست متأكدًا مما يعنيه NSUnknownKeyException أو لماذا لا تكون الفئة متوافقة مع ترميز القيمة الأساسية للمفتاح.

هل كانت مفيدة؟

المحلول

(هذا ليس خاصًا بجهاز iPhone حقًا - سيحدث نفس الشيء مع الكاكاو العادي).

NSUnknownKeyException هو خطأ شائع عند الاستخدام ترميز القيمة الرئيسية للوصول إلى مفتاح لا يملكه الكائن.

يمكن الوصول إلى خصائص معظم كائنات الكاكاو مباشرة:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

أو عبر ترميز القيمة الرئيسية:

[@"hello world" valueForKey:@"length"]

سأحصل على NSUnknownKeyException إذا استخدمت السطر التالي:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

لأن NSString لا يحتوي على خاصية (مفتاح) تسمى "purpleMonkeyDishwasher".

هناك شيء ما في التعليمات البرمجية الخاصة بك يحاول تعيين قيمة للمفتاح "kramerImage" على UIView، والذي (على ما يبدو) لا يدعم هذا المفتاح.إذا كنت تستخدم Interface Builder، فقد يكون هناك شيء ما في طرفك.

ابحث عن المكان الذي يتم فيه استخدام "kramerImage"، وحاول تعقبه من هناك.

نصائح أخرى

وأيضًا عند إعادة تسمية طريقة عرض، لا تنس حذف المرجع الموجود على "مالك الملف".قد يؤدي أيضًا إلى ظهور هذا الخطأ.

إليك أحد الأماكن التي ستتلقى فيها هذا الخطأ - وكيفية إصلاحه.كنت أحصل عليه عند تحميل طرف يحتوي للتو على TableViewCell مخصص.لقد استخدمت IB لإنشاء xib الذي يحتوي فقط على مالك الملف والمستجيب الأول وTableViewCell.يحتوي TableViewCell على 4 UILabels تتطابق مع فئة تحتوي على 4 IBOutlet UILabels تسمى rootCell.لقد قمت بتغيير فئة TableViewCell لتصبح rootCell.لقد كان الأمر جيدًا حتى تم إجراء بعض التغييرات وفجأة كنت أحصل على setValue:forUnifiedKey:عندما كنت أقوم فقط بإنشاء مثيل للفصل بعد تحميله من المنقار:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

لقد فشل في السطر الأول، عندما كان المنقار يحاول التحميل.بعد فترة من الوقت، لاحظت أنه كان يحاول مطابقة ملصقات IBOutlet مع وحدة التحكم الجذرية، وليس فئة rootCell!كانت تلك تلميحاتي.الخطأ الذي ارتكبته هو تغيير مالك الملف عن غير قصد إلى فئة rootCell.عندما قمت بتغييره مرة أخرى إلى NSObject، فإنه لم يحاول مطابقة المفوض (rootController) عند التحميل.لذا، إذا كنت تفعل ما ورد أعلاه، فاجعل File's Owner NSObject، ولكن اجعل UITableCell الفئة التي تريدها.

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

كان لي نفس المشكلة اليوم.لم يكن لدي الفئة المناسبة المحددة لوحدة تحكم العرض في وحدة تحكم التنقل الخاصة بي.سيحدث هذا كثيرًا إذا فشلت في تحديد الفئة الصحيحة لعروضك في Interface Builder.

ستواجه أيضًا مشكلات في المحدد غير الصالح.تحقق دائمًا من فئات واتصالات Interface Builder الخاصة بك!

هذه هي الطريقة التي قمت بحلها، في Interface Builder، انقر بزر الماوس الأيمن فوق وحدة تحكم العرض، ويجب أن تكون هناك علامة تعجب على المنفذ المفقود أو طريقة الإجراء.البحث عن كافة المراجع وإزالتها والتي حلها.

حدث هذا لأنني حذفت طريقة العمل في ملف .m.

يبدو أنك تفعل

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

ثم بعد تجميع عرض الصورة هذا، عند فتح "MyFirstIphoneAppViewController.xib" في Interface Builder، فإنك تأخذ عرض صورة من الأداة (القائمة)/المكتبة التي تربط هذا المنفذ بـ "InitialkramerImage" من مالك الملفات لـ "MyFirstIphoneAppViewController.xib" .ثم قمت بحفظ المشروع.ولكن بعد ذلك يمكنك تغيير اسم متغير المنفذ "InitialkramerImage" إلى "kramerImage".لذلك، بعد القيام بذلك

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

وحفظ المشروع عند تشغيله، لا يوجد منفذ "InitialkramerImage" في "MyFirstIphoneAppViewController.xib".لذلك، عند تشغيل المشروع لن يكون هناك مرجع منفذ من Imageview إلى 'kramerImage' و

"لعرض العرض ، سيحاول UiviewController العثور على منفذ" initialKramerimage "غير موجود."

لذلك، فإنه سيتم طرح "NSUnknownKeyException".

يمكنك التحقق من المخرج المفقود عن طريق فتح ملف NIB (.xib) ثم النقر بزر الماوس الأيمن على "مالك الملفات" لذلك.

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

أو يمكنك محاولة تغيير IBOutlet إلى kramerImage وربطه مرة أخرى في NIB.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top