أحاول ربط UILabel
بـ IBOutlet
الذي تم إنشاؤه في صفي.
يتعطل تطبيقي بسبب الخطأ التالي. ماذا يعني هذا؟ كيف يمكنني إصلاح ذلك؟
*** إنهاء التطبيق بسبب استثناء غير معلوم "NSUnknownKeyException" ، والسبب: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: هذه الفئة ليست متوافقة مع ترميز قيمة المفتاح XXX للمفتاح.'
لقد قمت بتنزيل مشروعك.
الخطأ الذي تحصل عليه هو
"NSUnknownKeyException" ، السبب: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: هذه الفئة ليست متوافقة مع ترميز القيمة الرئيسية لسلسلة المفاتيح.'
يحدث بسبب Second
عرض وحدة التحكم في MainWindow.xib
وجود فئةUIViewController
بدلاً من SecondView
. تغيير الفئة الصحيحة يحل المشكلة.
بالمناسبة ، من الممارسات السيئة الحصول على أسماء مثل "string" في Objective-C. فإنه يدعو الاصطدام تسمية وقت التشغيل. تجنبها حتى في تطبيقات التدريب مرة واحدة. قد يكون من الصعب للغاية تعقب اصطدامات التسمية ولا تريد تضييع الوقت.
سبب آخر محتمل لهذا الخطأ: عند نسخ ولصق العناصر من وحدة تحكم إلى أخرى ، يحافظ Xcode بطريقة ما على هذا الرابط بوحدة التحكم الأصلية ، حتى بعد تحرير هذا العنصر وإعادة ربطه بوحدة التحكم الجديدة.
سبب آخر محتمل لهذا الخطأ:
منفذ سيء.
لديك إما تمت إزالته أو تمت إعادة تسميته اسم منفذ في ملف .h
الخاص بك.
قم بإزالته في "مفتش الاتصال" في ملف .xib
أو .storyboard
.
لقد كان هذا الخطأ عدة مرات. في حين أن إجابة TechZen صحيحة تمامًا في هذه الحالة ، فإن السبب الشائع الآخر هو عندما تقوم بتغيير اسم خاصية IBOutlet في ملفك .h/.m الذي قمت بتوصيله بالفعل بمالك الملف في المنقار.
من بنك الاستثمار القومي:
ضمن "مرجع المخارج" ، تأكد من أن الكائن الخاص بك لا يزال غير متصل باسم الخاصية القديمة ... إذا كان كذلك ، انقر فوق "x" الصغير لحذف المرجع والبناء مرة أخرى.
سبب شائع آخر إذا كنت تستخدم Storyboard ، فقد يكون لدى UIButton أكثر من مهمة واحدة (الحل هو نفسه تقريباً بالنسبة لـ nib):
اضطررت إلى حذف التطبيق من جهاز محاكاة/iPhone للتخلص من هذا الخطأ.
كان لدي هذا الخطأ عندما كنت أحاول تطبيق ViewCell مخصص لجدول. عندما سلطت الضوء على وحدة تحكم العرض لـ XIB وتوصيلها بالعناصر الموجودة في CellView تسببت في الخطأ "هذه الفئة ليست متوافقة مع ترميز القيمة الرئيسية للمفتاح" بمجرد أن قمت بحذفها ، تخلصت من الخطأ.
حذف الاتصالات في الصورة أدناه.
فقط تأكد من أن لديك فقط اتصالات مع خلية عرض الجدول. للتحقق انقر فوق خلية عرض الجدول وفي المفتش ابحث عن اتصالاتك.
إذا كان تطبيق iPhone فقط ، وليس تطبيقًا عالميًا ، فتأكد من أن الحقل التالي فارغ:
الأهداف> ملخص> iPhone/iPod Deployment Info> الواجهة الرئيسية
إذا حددت xib هناك فسوف يتعطل.
يشير هذا الخطأ إلى أن منشئ واجهة متصل بالفعل {تتم إزالة/إعادة تسمية الكائن في مصدر مالكها (مالك الملف).
انقر مع الضغط على مفتاح التحكم على {ملف الملفات في Interface Builder إذا كنت ترى علامة تعجب تحتاج إلى إصلاح ذلك.
في الصورة أدناه ، يمكنك رؤية أن "aRemovedView" تحتوي على علامة تعجب على يمينها ، وذلك لأنني قمت بإزالة كائن عرض IBOutlet أثناء اتصاله بالفعل في IB.
هذا يعطي الخطأ التالي: إنهاء التطبيق بسبب استثناء غير معلوم 'NSUnknownKeyException' ، السبب: '[setValue: forUndefinedKey:]: هذه الفئة ليست متوافقة مع ترميز القيمة للمفتاح aRemovedView.'
واجهت نفس المشكلة ، وفي حين أن إجابة TechZen قد تكون مذهلة حقًا ، إلا أنني وجدت صعوبة في تطبيقها على وضعي.
في النهاية قمت بحل المشكلة عن طريق ربط التسمية عبر وحدة التحكم المدرجة ضمن الكائنات (الموضحة في الصورة أدناه) بدلاً من ذلك عبر ملف المالك .
أتمنى أن يساعدك هذا.
في حالتي ، كان خطأً في شفرة مصدر لوحة العمل ، اتبع الخطوات التالية:
<connections>
فمثلا:
<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 لتخطيط لوحة العمل ؛)
كان الإصلاح الخاص بي مشابهًا لجيرارد جرانديز. في إنشاء UITableViewCell مخصص باستخدام XIB ، قمت عن طريق الخطأ بتطبيق اسم الفئة المخصصة على مالك الملف بدلاً من UITableViewCell. تطبيق الفئة على UITableViewCell على اللوحة القماشية وربط خصائص IBOutlet الخاصة بي بها حل المشكلة.
IBOutlet
مرة واحدة ، IBOutlet
تسمية ivar الخاص بك غير ضرورية.UIViewController
؟ في مرحلة ما يجب أن تتصل [SecondView initWithNibName:@"yourNibName" bundle:nil];
كان هذا يحدث لي فقط عند تصحيح الأخطاء على جهاز (iPhone). كان iOS Simulator يعمل على ما يرام. يبدو أن القيام بـ "المنتج-> تنظيف" من Xcode يحل المشكلة ، لكن ليس لدي أي فكرة عن السبب.
يمكن أن تأتي من حقيقة أن لديك سيطرة سحب وإنشاء منفذ أو إجراء ، ونسي حذفه. حتى إذا قمت بحذف الكود ، أو حتى إذا قمت بعمل عدد كاف من cmd + Z ، فستحتاج إلى الدخول في مفتش الاتصال بلوحة العمل الخاصة بك ومعرفة ما إذا كان الإجراء أو المنفذ الذي أنشأته لا يزال هنا أم لا.
تلقيت رسالة الخطأ نفسها بالضبط وشكرت (!!) لكيرا من http://www.idev101.com تمكنت من حل التحدي. لقد وجدت موقعها فقط بعد googling و التراص على كل هذه المواضيع. أقوم الآن بالنشر هنا للتحدي التالي الذي يأتي إلى StackOverFlow ولديه نفس التحدي الذي واجهته لأن هذا الشخص سيأتي على الأرجح إلى هذا الموضوع عبر Google.
أدركت أنني فعلت هذا خطأ:
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];
عند النظر إلى الإجابات الأخرى ، يبدو أن هناك الكثير من الأشياء التي يمكن أن تسبب هذا الخطأ. هنا واحد أكثر.
اذا أنت
ثم قد تحصل أيضًا على خطأ مشابه
فشل في ضبط (xxx) خاصية تم فحصها بواسطة المستخدم في [طريقة العرض المخصصة] ...: هذه الفئة ليست متوافقة مع تشفير قيمة المفتاح للمفتاح [xxx].
الحل هو حذف الخاصية القديمة.
افتح مفتش الهوية لفئتك ، وحدد اسم الخاصية ضمن سمات وقت تشغيل محدد بواسطة المستخدم ، واضغط على زر ناقص (-).
يحدث هذا لي عندما يكون لدى وحدة التحكم في العرض الخاصة بي ملف .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];
}
قد تختلف خاصية "الوحدة النمطية" لوحدة تحكم العرض في "مفتش الهوية" عما كنت تتوقعه. تأكد أيضًا من إضافة فصول جديدة إلى قائمة أهدافك.
واجهت مشكلة مماثلة لمشروع يحتوي على هدفين (مع MainWindow XIB الخاص بهم). كانت المشكلة الأساسية التي تسببت في هذا الخطأ بالنسبة لي هي عدم تضمين فئة UIViewController في قائمة موارد المشروع الثاني. أي. سمح لي أداة إنشاء الواجهة بتحديده في MainWindow.xib ، لكن في وقت التشغيل لم يتمكن النظام من تحديد موقع الفصل.
أي. cmd- انقر فوق فئة UIViewController المعنية وتحقق جيدًا من تضمينها في علامة التبويب "الأهداف".
قد يكون هذا هو حال الرجوع إلى أحد مكونات واجهة Xib التي قمت بإعادة تسميتها أو حذفها. إعادة مرجعية يعمل بالنسبة لي.
لقد واجهت هذه المشكلة في مشروعي المكرر وتم حلها عن طريق التحقق من مكانين:
1- تأكد من وجود ملف .m في القائمة -> المشروع - إنشاء المراحل - تجميع المصادر
2- بعد ذلك ، انتقل إلى أداة إنشاء الواجهة (من المحتمل أن يكون هذا خطأ يحدث مع IB فقط) وإلغاء ربط جميع الخصائص والعلامات والصور وغيرها ... ثم إعادة ربط الكل. لقد أدركت أنني أزلت سمة ولكن لا تزال مرتبطة في IB.
آمل أن يعمل لبعض.
فقط لإضافة إلى هذا ، لأنني كنت أتلقى هذا الخطأ كذلك. يبدو أن تطبيق كل هذه الإجابات ينطبق على العمل مع واجهة المستخدم والمواد المصورة. أعلم أن الملصق الأصلي يبدو أنه يعمل مع واجهة المستخدم ، لكن عند البحث عن أسباب محتملة لهذا الخطأ ، فغالبًا ما تعود جميع الأسئلة إلى هذا السؤال حيث يتم إغلاق الآخرين كنسخة مكررة أو ببساطة تواجه مشكلات في ربط الأشياء في لوحة العمل ، لذلك سأفعل أضف الحل الخاص بي.
كنت أعمل على ترميز خدمة ويب في Swift 2. كنت قد صممت كل كائنات الوكيل المطلوبة وكعبات الروتين. أثناء تجوالك في XML الذي تم إرجاعه ، كنت أقوم بنسخ كائنات بشكل حيوي ، والتي أتت جميعها من NSObject
وباستخدام setValue:forKey
عليها. في كل مرة حاول setValue:forKey
تعيين خاصية انفجرت بسبب هذا الخطأ.
كان لدي بيان تبديل لكل نوع كنت أتعامل معه (على سبيل المثال ، Bool?
، CShort?
، String?
) ولكل عقدة XML مررت بها ودققت في نوع الكائن ثم قمت بتحويل القيمة إلى ذلك النوع وحاولت تعيينه مع setValue:forKey
.
أخيرًا ، بدأت في التعليق على جميع سطور setValue:forKey
هذه ، ووجدت أن حالة بيان التبديل default
عملت مع String?
.
أخيرًا ، اكتشفت أنك لا يمكنك استخدام أنواع سويفت الاختيارية مع setValue:forKey
إلا إذا كان لديها تخطيط مباشر لنوع Object-C مثل String?
أو NSNumber?
. انتهى بي الأمر إلى تغيير جميع أنواع CShort?
إلى NSNumber?
نظرًا لأن ذلك يحتوي على تعيين مباشر. بالنسبة لـ Bool?
في حالتي ، كان من الجيد بالنسبة لي استخدام Bool
وتهيئته إلى false
. البعض الآخر قد لا يكون هذا الترف.
على أي حال ، ما آلام الصداع التي يؤمل أن يساعد ذلك شخصًا آخر لديه مشكلة مماثلة ويستمر في إعادة توجيهه إلى هذا السؤال ويقول لنفسه "لا أفعل شيئًا في واجهة المستخدم !!".
لذا ، أخيرًا ، كرر مرة أخرى لا يعمل ترميز Key-Value مع الخيارات الاختيارية. انتهى بي الأمر بالعثور على مكان ما ، لكني أنسى أين يعتذر ، ومن تذكر ذلك ، إذا كنت أتذكر أين وجدت هذا لكنه أنقذ حياتي:
لا يمكنك استخدام KVC على خاصية Int Int ، لأن KVC هو Cocoa/Objective-C ، والهدف C لا يمكنه رؤية Int اختياري - لا يتم ربطه بالهدف- C. يمكن أن يرى الهدف- C فقط الأنواع التي يتم ربطها بالهدف- C:
أنواع الفئات المشتقة من NSObject
أنواع الصفوف التي يتم كشفها بواسطةobjc
الهياكل السريعة التي يتم سدها
هذا الخطأ هو شيء آخر!
إليكم كيف أصلحته. أنا أستخدم الإصدار 6.1.1 من xcode وأستخدم Swift. لقد حصلت على هذا الخطأ في كل مرة حاول فيها تطبيقي أداء سلسلة من الألعاب للقفز إلى الشاشة التالية. هنا ما فعلت.
في صحتك،
"هذه الفئة ليست متوافقة مع تشفير القيمة الأساسية للمفتاح" أعرف أن الوقت متأخر قليلاً ولكن إجابتي مختلفة لذا أعتقد أنه يجب نشرها ، كنت أقوم بدفع وحدة التحكم الثانية بطريقة خاطئة ، إليك نموذج
طريقة خاطئة لدفع المراقب المالي
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];
لم أجد أي إجابة كما هو مذكور أعلاه ، فربما يكون من الممكن مساعدة شخص ما لديه نفس المشكلة
كانت هناك مشكلة أخرى "غير متوافقة" وجدت عندما تمكنت من الحصول على نسختين من الفصل لسبب ما.
كنت أضيف مفاتيح إلى نسخة خاطئة. لا يزال Interface Builder يرى المفاتيح ويسمح لي بتوصيلها ، لكن في وقت التشغيل كان يستخدم النسخة الأخرى من الفصل التي لم يكن بها المفاتيح الجديدة.
للعثور على النسخة "الصحيحة" التي استخدمتها ، انقر فوق cmd الخاص بـ XCode على اسم الفصل في مكان آخر للانتقال إلى النسخة الصحيحة ، ثم قتلت النسخ غير المستخدمة غير الصالحة (بعد إحضار تعديلاتي من النسخة غير المستخدمة أولاً).
معنويات القصة: الملفات الصفية المكررة سيئة.
إذا كان لديك فئة فرعية مخصصة لـ UIViewController مع IBOutlets والتي تسبب مشاكل ، فإن المجموعة الوحيدة من الخطوات التي وجدتها للتخلص من الخطأ هي
.1 قم بتغيير الفئة إلى UIViewController
.2 افصل جميع المنافذ (ستحصل جميعها على مثلث التحذير الأصفر الآن) - قد يكون ذلك كافياً فقط لفصل منفذ (منافذ) الإشكالية.
.3 قم بجميع الخطوات القياسية -، ⌘K ، احذف البيانات المشتقة (، سجادات الصلاة ، خرز القلق)
.4 قم بتشغيل التطبيق - انتقل إلى المشهد الإشكالي.
.5 اقتل التطبيق ، ارجع إلى Interface Builder وقم بتغيير الفئة مرة أخرى إلى اسم صفك المخصص.
.6 أعد توصيل منافذ البيع الخاصة بك.
قم بتشغيل التطبيق وسيؤدي هذا عادةً إلى مسح مشكلات الامتثال ذات القيمة الأساسية.
كان لي نفس الأعراض. السبب الرئيسي هو أن "العضوية المستهدفة" لملفي المصدر لم يتم ضبطها على الهدف الصحيح. أفترض أن هذا يعني أن صفي لن يتم بناؤه وإدراجه في تطبيقي.
لتصحيح ذلك:
آمل أن يكون هذا يساعد شخص ما هناك.
في حالتي. لم يكن لدي منافذ مفقودة في ملفات xib بعد الدمج.
Shift + Command + K
حل مشكلتي. قمت بتنظيف مشروعي وإعادة بنائه.
في حالتي ، كان السبب في ذلك هو الرجوع إلى Nib الخطأ:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
كان لدي نفس النوع من المشكلة. لقد قمت بإنشاء tableviewCell في ملف XIB وكنت أتلقى هذا النوع من الخطأ. كانت مشكلتي هي أنني حددت فئة "مالك الملف" لتكون جهاز التحكم في طريقة عرض الخلية الخاصة بي. لقد أخرجتها للتو واضبطت فئة الخلية (في ملف xib ، انقر فوق حد الخلية ، وانتقل إلى علامة التبويب الثالثة في اللوحة اليمنى وحيث تقول أن الفئة اختارت جهاز التحكم في العرض الخاص بك).
حاول أيضًا تنظيف الكود.
حصلت على نفس المشكلة فعلت إعادة ضبط جهاز محاكاة. إزالة وإضافة زر التحكم. وأخيرا جعل نظيفة. :) بفضل تجاوز سعة المكدس. كيف أصبح الكود الخاص بي جيدًا وبدأ العمل.
قد يكون لديك منافذ إلى UI Element لكن لا تملك خاصية IBOutlet في .h File
بالنسبة لكل عنصر واجهة المستخدم في منافذ اتصال الاختيار ، يتم التحقق من الخاصية في ملف رأس h.
قد يفقد إدخال خاصية واحد أو أكثر في ملف .h.
كنت أتلقى هذا الخطأ مع القصص المصورة. لا يبدو أن المشكلة المذكورة أعلاه هي المشكلة ، لذلك انتهى بي الأمر إلى حذف وحدة التحكم في العرض وإضافتها مرة أخرى (وبالطبع إعادة توصيل السلسلة وإعادة تعيين الفئة) التي حددتها. لا أعلم ما كانت عليه بالفعل ، لكنني قمت بإعادة تسمية فئة وحدة التحكم في العرض المرتبطة قبل فترة وجيزة من بدء ذلك ، لذا ربما يكون ذلك قد شفي شيئًا ما.
تحقق مما إذا كانت لديك منافذ مرجعية طائشة من خلال تحديد الكائن المسيء في واجهة لوحة العمل/xib وفتح Connections Inspector (View-> Utilities-> Show Connections Inspector). إذا قمت بإزالة الاتصالات غير المرغوب فيها ويجب أن تكون على ما يرام.
واجهت نفس المشكلة. حدث هذا مع مشروعي لأنني غيرت اسم المنتج الخاص بي ولكن في أداة إنشاء الواجهة ، كان لي الاسم القديم كوحدة نمطية ، مما يؤدي إلى تعطلها ، لذا تأكد من التحقق من تغيير اسم وحدة xib أيضًا أو لا.
لقد حذفت الخاصية من ملف الرأس. لم أتمكن من العثور على أي إشارة إليه ، لكن خطأ التصحيح كان لا يزال يشير إليه. لقد وجدت أن ملف nib لا يزال لديه إشارة إليه. لقد حذفت الكتلة التي أشرت إليها وتم إصلاح كل شيء.
في Project Navigator ،
ابحث عن ملف Nib (xib). انقر بزر الماوس الأيمن وعرض المصدر. لقد حذفت القسم الكامل التالي
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">DeleteLabel</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="774585933"/>
</object>
<int key="connectionID">20</int>
</object>
قد تحتاج إلى حذف المنفذ ، وإعادة إنشائه عن طريق رسم النموذج IB إلى ملف .H.
يحدث هذا أيضًا لي عندما تتم الإشارة إلى تسمية UI أو عنصر واجهة مستخدم آخر بواسطة متغيرين في فئة وحدة التحكم في طريقة العرض وحذف أحد المتغيرات.
لقد حدث هذا عندما حصلت على رابط UIView في لوحة العمل وربط IBOutlet مثل:
@property (strong, nonatomic) IBOutlet UIView *someView
ولكن في وقت لاحق ، قمت بإجراء UIView في فئة مخصصة ولكن نسيت تغيير اسم فئة IBOutlet المحددة أعلاه. إنه خطأ غريب لأنه إذا كان العرض المخصص لا يحتوي على مقابلات فرعية ، فإنه لا يشكو ، ولكن بمجرد وجود مقابلات فرعية فإنه يظهر الخطأ المذكور في السؤال ولكن في أحد المقابلات الفرعية وليس على UIView الخارجية حيث توجد المشكلة بالفعل. جعلني أحذف كل المقاطع الفرعية وأقرأها وأنا أحاول إيجاد المشكلة ، بينما في الحقيقة لم يكن لي أي علاقة بالمقابلات الفرعية
في حالتي،
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
كان السبب.
استبدال هذا بـ initWithNibName ، تم الحل.
واجهت نفس المشكلة عندما كنت أستخدم لوحة العمل الرئيسية كملف شاشة بدء التشغيل . أعتقد أنه إذا كنت تستخدم لوحة العمل كملف شاشة بدء التشغيل ، فلا ينبغي أن تكون متصلاً بوحدة التحكم في العرض حيث لن يتم تحميلها بعد.
سبب واحد آخر لهذا الموقف هو أنك تعلن أن هذه الخاصية مطبقة على أنها @ ديناميكية ، ولكن لا يمكن العثور عليها في الفئة الأصل.
قد يعني ذلك أنك تحاول استخدام واصف الفرز دون وجود علامة atsign في البداية. كما في:
[array valueForKeyPath:@"distinctUnionOfObjects.self"]
والتي يجب أن تكون في الواقع:
[array valueForKeyPath:@"@distinctUnionOfObjects.self"]
لقد حدث هذا بالفعل لي مرتين.
كان الحل هو إعادة تشكيل لوحة العمل بالكامل منذ أن قمت بنسخها من واحدة أخرى (لأنها كانت تقريبًا مماثلة)
واجهت نفس المشكلة ، وكان السبب في ذلك هو تحديد وحدة نمطية في Interface Builder (بدلاً من تركها فارغة). لذلك ، عندما كنت تستخدم وحدة نمطية مختلفة عن الوحدة التي قمت بتعيينها ، سيتعطل التطبيق: S ... آمل أن يساعد هذا شخصًا آخر ، لأن مشكلتي لم تكن بسبب وجود منفذ بيع قديم أو قديم!
جنبا إلى جنب مع غيرها من القضايا التي يمكنك أن ترى في إجابات أخرى. كانت الطريقة التي خلقت بها هذا الخطأ بنفسي هي أنني بدأت مشروعًا من نقطة الصفر وأبدأ بحذف المشهد الأولي من لوحة العمل الخاصة بي ثم لصق مشهد من مشروع آخر في لوحة العمل الخاصة بي.
لا توجد مشكلة في القيام بذلك. ما عليك سوى إضافة نقطة إدخال في لوحة العمل الخاصة بك ، أي التحقق من is initial View Controller
الذي تشاهد فيه وحدة التحكم التي تريدها. وإلا سيكون مشهدًا رماديًا ويرميك خطأً.
نفس القضية المقدمة. كان حلي هو وضع قيمة لوحة العمل الصحيحة في القائمة الرئيسية لـ Storyboard. لقد قمت بإعادة تسمية mainstoryboard.storyboard ، لكن لا أعيد تعيين معلومات النشر.
واجهت نفس المشكلة لسبب مختلف: كنت أستخدم لوحة العمل الرئيسية مثل ملف شاشة الإطلاق . أعتقد أنه إذا كنت تستخدم لوحة العمل كملف شاشة بدء التشغيل ، فلا ينبغي أن تكون متصلاً بوحدة التحكم في العرض حيث لن يتم تحميلها بعد.
كان لي هذه المشكلة مع فئات سويفت بعد الترقية إلى xcode7. حلها باستخدام التوجيهobjc:
objc (XXXViewController) فئة XXXViewController
في حالتي ، تم تغيير اسم خاصية IBOutlet في ViewController.m ، لكن الاسم الموجود في Storyboard لم يتم تغييره. إعادة إدخال IBOutlet في ViewController.m لكل ctrl السحب حل المشكلة. لقد لاحظت أيضًا طريقة للعثور على IBOutlets "الأيتام" في XCode: (انظر إلى الصورة) تلك التي لا "تيتم" لها دوائر متحدة المركز بدلاً من أرقام الأسطر.
كان لدي هذه المشكلة مع القصة المصورة وفئة سويفت لوحدة تحكم عرض واجهة المستخدم. حلها باستخدام التوجيهobjc:
@objc(MyViewController) class MyViewController
واجهت نفس سجل الخطأ عند التعامل مع خلية viewview الخاصة بي. لقد وجدت أن UILabels الخاص بي يحتوي على منافذ مرجعية مكررة (يمكنك التحقق من ذلك في مفتش المرجع) لكل من مالك الملف وفئتي الخلوية. الأمور تتحسن عندما أحذف الإشارة إلى مالك الملف.
لقد قمت بحل هذه المشكلة عن طريق القيام بأمرين:
لول 54 الإجابات وليس واحد منهم هو حل لي. تحدث عن خطأ شائع.
في حالتي ، كان السبب في ذلك هو أنني أملك كائنًا منتقيًا على VC ولم أقم بمنفذ وإجراء له.
غالبًا ما أترك الأزرار وما إلى ذلك غير متصلة عندما أبحث فقط لأرى كيف يبدو الشكل. ولكن يبدو أنه لا يمكنك القيام بذلك من أجل منتقي.
فقط انتبه إذا كنت تحاول ملاحظة قيمة غير موجودة.
حدث هذا لي ببساطة عندما كنت أراقب خاصية "النص" لحقل النص عندما كان من المفترض أن أراقب خاصية "النص" بدلاً من ذلك.
كان لدي نفس الخطأ في شكل مختلف قليلاً آخر:
في أداة إنشاء الواجهة ، لدي وحدة تحكم في التنقل مزودة بمراقب فرعي مخصص. تم تعيين اسم الفئة لهذا بشكل صحيح ، ومع ذلك تم تعيين اسم NIB (حدد مراقبًا فرعيًا ، انتقل إلى Attributes Inspector) على الملف الخطأ (بشكل أساسي على هدف مختلف). إعادة تعيين هذا إلى اسم الملف الصحيح حل المشكلة.
سبب مشكلتي هو أنني قمت بتكرار ملف لوحة العمل (خارج Xcode إذا كنت أتذكر بشكل صحيح) ، ثم كان لدى جميع أجهزة التحكم في العرض في الملف المكرر نفس معرف الكائن كما في الملف الأصلي. يتمثل العلاج في نسخ وحدات تحكم العرض الملصقة ، وسيحصلون بعد ذلك على معرف كائن جديد. يمكنك رؤية معرّف الكائن في مفتش الهوية.
في حالتي ، أضفت ViewController إلى لوحة العمل ، لكنني لم أقم بتعيين معرّف القصة المصورة في المصمم. بمجرد أن أعطيته هوية ، نجحت.
باستخدام Xamarin/Visual Studio 2015.
تأكد من إضافة تطبيق الفئة المخصصة (حتى الفارغة) في ملف .m
مثل:
@implementation MySubclass
@end
لقد وجدت احتمالًا آخر قد يسبب المشكلة.
عند استخدام طريقة "initWithNibName" مع اسم xib خاطئ ، سيؤدي ذلك إلى حدوث هذا النوع من التعطل أيضًا.
مثل اختيار تغيير اسم ملف xib ، ثم foget لتغيير الاسم المستخدم في طريقة "initWithNibName" إلى نفس الاسم.
في بعض الأحيان لا تتم إضافة ملف Swift أو إزالته من الهدف ، انتقل إلى الهدف -> إعداد الإعداد -> ترجمة المصادر -> معرفة ما إذا كان هناك أي ملف فئة Swift مطلوب مفقود أم لا. في حالتي ، تعطل التطبيق بسبب عدم وجود ملف مصدر Swift في الترجمة.
كان لي هذه المشكلة أيضا. لقد قمت بنسخ طريقة عرض باستخدام IBOutlet من ملف xib واحد إلى ملف xib آخر. وعلى الرغم من إزالة المرجع القديم وإنشاء مرجع جديد ، فإن هذا الخطأ لا يزال يحدث.
انتهى بي الأمر إعادة تشغيل xcode لإصلاح هذه المشكلة.
بدأت مشكلتي بعد أن قمت بتغيير اسم الهدف.
تحتوي فئات واجهة المستخدم المخصصة الخاصة بي على اسم الوحدة النمطية الذي تم تعيينه على الاسم الهدف القديم.
لقد غيرت الاسم المستهدف إلى الاسم الجديد وهو يعمل بشكل جيد الآن.
عادة عندما يحدث هذا لي ، فإن إجابة @ TechZen تقوم بالخدعة. أمس ، ومع ذلك ، قضيت وقتًا طويلًا محرجًا في السخرية من اتصالات لوحة العمل فقط لاكتشاف المشكلة في الكود.
لديّ وحدة تحكم مخصصة للعرض تتعامل مع تخطيطات متعددة في لوحة العمل الخاصة بي ، لكن أحد التخطيطات احتاج إلى ملصق خاص لا يستخدمه الآخرون. لذلك قمت بإنشاء فئة فرعية مثل ذلك:
@interface MyViewControllerSubclass : MyViewController
ثم أضفت خاصية خاصة في MyViewControllerSubclass.m:
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end
سمح Xcode بسرور لي للاتصال IBOutlet ، ولكن في كل مرة يتم تحميل العرض ، سيتعطل التطبيق مع القديم "غير متوافق مع قيمة مفتاح" chrashesApp "".
كان الحل ، وهو أمر شبه واضح في الماضي ، هو تغيير الفئة الخاصة لاستخدام الاسم الصحيح ، أي اسم الفئة الفرعية :
@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
أتذكر أنني واجهت مشكلة مماثلة في الماضي ، لقد تم حلها عن طريق تغيير الخط:
_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];
إلى:
#include "vicLogin_iPad.h" // This is the H file of the class holding the code for
// processing all the IBOUtlets for the Login screen
.
.
.
_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];
لاحظ أنني كنت أُعلن مبدئيًا أن UIViewController لبدء تشغيل _vicMain ، بعد استخدام نافذة منبثقة في الأعلى ، أدركت أن كلاً منهما يستخدم نفس UIViewController.
بواسطة:
1) بما في ذلك الفصل الدراسي الخاص بك (للعرض الفرعي) ، جنبًا إلى جنب مع نفس الوحدة النمطية التي تقوم بما سبق _vicMain (والذي يعد كائن/متغير تحكم في طريقة العرض) بمعنى أنه "vicLogin_iPad.h" في حالتي ، و:
2) استخدم المُنشئ المخصص لإعلان الكائن (أي بدلاً من "xxx = [UIViewController alloc] ...
" ، فأنت تستخدم "xxx = [vicLogin_iPad alloc] ...
" بدلاً من ذلك.
تم حل المشكلة.
آمل أن يكون هذا مفيدًا لأنه كان الألم هو عدم وجود تفاصيل من رسالة الخطأ ...
التحيات حيدر ساتي
تحدث هذه المشكلة أيضًا إذا كنت تريد تصميم عرض فرعي صغير في ملف XIB منفصل في Interface Builder ، وفي IB قمت بتعيينه إلى نفس الفئة مثل طريقة العرض الأصل.
إذا قمت بإظهارها كالتالي:
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];
سيظهر العرض ، لكن إذا كان هناك IBOutlets
متصل بمالك الملف الخاص به ، فستتلقى رسالة الخطأ. لذلك ، يجب أن يعمل هذا بدلاً من ذلك:
IBOutlet UIView *mySubview
للإشارة إلى العرض في ملف nib للعرض الفرعيmySubview
[[NSBundle mainBundle] loadNibNamed: @ "NameOfTheSubviewNibFile" owner: self self:: nil] [self.view addSubview: mySubview]؛
وسوف تكون بخير!
حالة صعبة أخرى:
في IB أضاف ViewController إلى لوحة العمل ، وحذف طريقة العرض الخاصة به وتعيين Custom Class على "MyViewController" بحيث يتم إنشاء مثيل للعرض من MyViewController.xib
تحديد معرف لوحة العمل نفس "MyViewController" يؤدي استثناء.
تغيير معرف لوحة العمل إلى اسم مختلف يحل المشكلة.