2008-09-05 14 views
18

मैं अपना पहला आईफोन ऐप लिख रहा हूं, इसलिए मुझे डिबगिंग के तरीके में बहुत कुछ पता लगाने के लिए नहीं मिला है। अनिवार्य रूप से मेरा ऐप एक छवि प्रदर्शित करता है और जब स्पर्श किया जाता है तो एक छोटी आवाज बजाता है। एक्सकोड में प्रोजेक्ट को संकलित और निर्माण करते समय, सब कुछ सफलतापूर्वक बनाता है, लेकिन जब ऐप आईफोन सिम्युलेटर में चलाया जाता है, तो यह क्रैश हो जाता है।आईएसओ ऐप NSUnknownKeyException सेट के साथ दुर्घटनाग्रस्त हो गया: वैल्यू:

मैं निम्नलिखित त्रुटि मिलती है:

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 यहाँ छवि मैं पृष्ठभूमि के लिए उपयोग कर रहा हूँ है।

मुझे यकीन नहीं है कि NSUnknownKEException का अर्थ क्या है या क्यों कुंजी कुंजी के लिए कोडिंग-अनुरूप नहीं है।

उत्तर

22

(यह वास्तव में आईफोन विशिष्ट नहीं है - वही बात नियमित कोको में होगी)।

NSUnknownKeyException Key-Value Coding का उपयोग करते समय एक सामान्य त्रुटि है जब ऑब्जेक्ट की कुंजी नहीं है।

सबसे कोको वस्तुओं के गुण सीधे एक्सेस कर सकते हैं:

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

या कुंजी-मान कोडिंग के माध्यम से:

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

मैं एक NSUnknownKeyException मिलेगा अगर मैं निम्न पंक्ति इस्तेमाल किया:

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

क्योंकि एनएसएसटींग में एक संपत्ति (कुंजी) नहीं है जिसे 'बैंगनीमोन्की डिशवॉशर' कहा जाता है।

आपके कोड में कुछ यूआईवी व्यू पर कुंजी 'क्रैमर इमेज' के लिए एक मूल्य निर्धारित करने का प्रयास कर रहा है, जो (स्पष्ट रूप से) उस कुंजी का समर्थन नहीं करता है। यदि आप इंटरफ़ेस बिल्डर का उपयोग कर रहे हैं, तो यह आपके निब में कुछ हो सकता है।

खोजें कि 'क्रैमर इमेज' का उपयोग किया जा रहा है, और वहां से इसे ट्रैक करने का प्रयास करें।

+2

मुझे यह त्रुटि मिल रही है, और यह इंटरफ़ेसबिल्डर के साथ कुछ करने के लिए है, लेकिन मैं इसे ठीक करने का तरीका नहीं समझ सकता। – bentford

+1

इसके लिए धन्यवाद - एक और अंत में 3 घंटे बर्बाद हो गया। :) –

+0

मुझे इस समस्या में ऐसी समस्या थी जहां मैंने एक परियोजना से दूसरे प्रोजेक्ट की प्रतिलिपि बनाई थी। मेरा xib गलत वर्ग नाम का संदर्भ देता है। इस जवाब ने मुझे यूरेका पल के लिए पर्याप्त जानकारी दी, इसलिए धन्यवाद। – Grumdrig

10

साथ ही जब आप किसी दृश्य का नाम बदलते हैं, तो फ़ाइल के स्वामी पर संदर्भ को मिटाना न भूलें। यह भी इस त्रुटि को उठा सकता है।

+1

+1 यह मेरे साथ हुआ । मैंने अपने एमकेमैप व्यू के लिए वैरिएबल का नाम बदल दिया और अचानक बीएएम! NSUknownUknownKeyException। – ladookie

+0

स्टोरीबोर्ड में कुछ भी ऐसा लिंक नहीं था जिससे KeyValue त्रुटि हुई। यह मेरी समस्या हल हो गई। धन्यवाद! –

8

यहां एक ऐसा स्थान है जहां आपको यह त्रुटि मिल जाएगी - और इसे कैसे ठीक किया जाए। मैं एक निब लोड करते समय इसे प्राप्त कर रहा था जिसमें अभी एक कस्टम TableViewCell था। मैंने आईबी का उपयोग एक एक्सबी बनाने के लिए किया था जिसमें फाइल का स्वामी, फर्स्ट रेस्पॉन्डर और टेबल व्यूसेल था। TableViewCell में केवल 4 UILabels थे जो रूट आईसेल नामक 4 आईबीओलेट यूलाबेल के साथ एक कक्षा तक मेल खाते थे। मैंने tableViewCell की कक्षा को rootCell के रूप में बदल दिया। यह ठीक काम किया जब तक एक परिवर्तन की एक जोड़ी बना रहे हैं और अचानक मैं setValue हो रही थी: forUndefinedKey: जब मैं सिर्फ एक निब से यह लोड करने के बाद वर्ग instantiating गया था:

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

    cell = [nib objectAtIndex:0]; 

यह पहली पंक्ति में विफल रहा है, जब नीब लोड करने की कोशिश कर रहा था। थोड़ी देर के बाद, मैंने देखा कि यह आईबीओलेट लेबल को रूट नियंत्रक से मिलान करने की कोशिश कर रहा था, न कि रूटसेल क्लास! वह मेरा टिपऑफ था। मैंने गलत किया था कि अनजाने में फाइल के मालिक को रूटसेल क्लास में बदलना था। जब मैंने इसे वापस NSObject में बदल दिया, तो लोड होने पर प्रतिनिधि (रूटकंट्रोलर) तक मिलान करने का प्रयास नहीं किया। इसलिए, यदि आप उपर्युक्त कर रहे हैं, तो फ़ाइल के मालिक को एनएसओब्जेक्ट बनाएं, लेकिन यूआईटीबलसेल को अपनी वांछित कक्षा बनाएं।

+0

+1 और खुद को और किसी और को नोट करें जो _always_ इसे भूल जाता है: loadNibNamed का उपयोग करते समय: मालिक: विकल्प :, फ़ाइल का स्वामी NSObject होना चाहिए, मुख्य दृश्य आपकी कक्षा का प्रकार होना चाहिए, और सभी आउटलेट को दृश्य में जोड़ दिया जाना चाहिए , फ़ाइल के स्वामी _not_। – Echelon

+0

धन्यवाद ओवेन, मैं बिल्कुल उसी स्थिति के साथ संघर्ष कर रहा था। वर्णित के रूप में हल किया गया। आपका बहुत बहुत धन्यवाद! – Khiet

0

यह जब आप "MyFirstIphoneAppViewController.xib" खुला इंटरफ़ेस बिल्डर में आपको लगता है कि imageView, synthesizing के बाद

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

कर रहे हैं तो लगता है, आप उपकरण (मेनू) से एक छवि देखें लाइब्रेरी मांद जोड़ने ले जा रहे हैं/कि "MyFirstIphoneAppViewController.xib" के फाइल स्वामी से 'InitialkramerImage' को आउटलेट करें। फिर आपने परियोजना को बचाया। लेकिन उसके बाद आप आउटलेट वैरिएबल "InitialkramerImage" का नाम "क्रैमर इमेज" में बदल सकते हैं। तो, यह

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

कर रहे हैं और परियोजना जब आप इसे चलाते बचाने के बाद, वहाँ "MyFirstIphoneAppViewController.xib" में "InitialkramerImage" के आउटलेट का कोई अस्तित्व है। इसलिए, जब आप प्रोजेक्ट को चलाने में कोई imageView से 'kramerImage' और

"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."

तो, यह "NSUnknownKeyException" फेंक देंगे संदर्भित आउटलेट हो जाएगा।

You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.

2

मुझे आज भी यही समस्या थी। मेरे पास नेविगेशन कंट्रोलर में व्यू कंट्रोलर के लिए निर्दिष्ट सही श्रेणी नहीं थी। यह तब होता है जब आप इंटरफ़ेस बिल्डर में अपने विचारों के लिए सही कक्षा निर्दिष्ट करने में विफल रहते हैं।

आपको भी अमान्य चयनकर्ता समस्याएं भी मिलेंगी। हमेशा अपने इंटरफेस बिल्डर वर्गों और कनेक्शन की जांच करें!

+0

धन्यवाद। मेरे पास आईबी में सही ढंग से निर्दिष्ट वर्ग था, लेकिन मेरे नियंत्रक और निब के बीच एक विसंगति थी जिसे मैंने initWithNibName में निर्दिष्ट किया था: - मुझे अपनी प्रतिलिपि + पेस्ट विशेषाधिकार निरस्त करना चाहिए। – masty

+0

बस आईओएस डोजो पर वापस जाएं और अपनी प्रतिलिपि + पेस्ट-फू का अभ्यास करें। – gonzobrains

0

यदि आपने यह कोड कहीं और किया है और एक ज़िप/संपीड़ित फ़ाइल है, तो इसे फिर से निकालने का प्रयास करें। यह काम कर सकता है मुझे नहीं पता कि क्यों, लेकिन मुझे लगता है कि यह एक निष्कर्षण मुद्दा है।

या आप आईबीओलेट को क्रैमर इमेज में बदलने की कोशिश कर सकते हैं और एनआईबी में इसे फिर से बांध सकते हैं।

2

मेरे पास यह स्थिति थी और यह चर के सभी उदाहरण ढूंढने के बाद भी निकलता है और उन्हें मेरे ऐप को अभी भी क्रैश कर देता है। क्या हुआ ... मैंने अपने XIB से एक टेक्स्टफील्ड से एक चर का एक और उदाहरण बनाया है जो मेरे व्यू कंट्रोलर.h में है, लेकिन मुझे एहसास हुआ कि मुझे अब इसकी आवश्यकता नहीं है और इसे हटा दिया गया है। यह पता चला कि मेरे कार्यक्रम ने देखा है और कार्यक्रम में इसका उपयोग करने की कोशिश कर रहा है, इसलिए भविष्य में यदि यह कहीं और होता है तो बस आप में जाएं XIB बटन या टेक्स्टफील्ड आदि पर राइट-क्लिक करें और कोई अतिरिक्त अप्रयुक्त चर हटाएं।

2

इस प्रकार मैंने अपना हल किया है, इंटरफेस बिल्डर में व्यू कंट्रोलर पर राइट-क्लिक करें, गायब आउटलेट या एक्शन विधि पर विस्मयादिबोधक चिह्न होना चाहिए। सभी संदर्भों को ढूंढें और हटाएं और इसे हल करें।

ऐसा इसलिए हुआ क्योंकि मैंने .m फ़ाइल में क्रिया विधि को हटा दिया था।

संबंधित मुद्दे