भले ही इंटरफ़ेस बिल्डर के बारे में पता है MyClass
, मुझे आवेदन शुरू करते समय एक त्रुटि मिलती है।
ऐसा तब होता है जब MyClass
मैं लाइब्रेरी का हिस्सा होता हूं, और अगर मैं क्लास को सीधे एप्लिकेशन टारगेट में संकलित करता हूं तो ऐसा नहीं होता है।
भले ही इंटरफ़ेस बिल्डर के बारे में पता है MyClass
, मुझे आवेदन शुरू करते समय एक त्रुटि मिलती है।
ऐसा तब होता है जब MyClass
मैं लाइब्रेरी का हिस्सा होता हूं, और अगर मैं क्लास को सीधे एप्लिकेशन टारगेट में संकलित करता हूं तो ऐसा नहीं होता है।
जवाबों:
" अज्ञात वर्ग MyClass in Interface Builder फ़ाइल " के बावजूद , रनटाइम पर प्रिंट की गई त्रुटि, इस समस्या का इंटरफ़ेस बिल्डर के साथ कोई लेना-देना नहीं है, बल्कि लिंकर के साथ है, जो एक वर्ग को लिंक नहीं कर रहा है क्योंकि कोई भी कोड इसका सीधे उपयोग नहीं करता है।
जब .nib डेटा (.xib से संकलित) रनटाइम पर लोड किया जाता है, MyClass
एक स्ट्रिंग का उपयोग करके संदर्भित किया जाता है, लेकिन लिंकर कोड कार्यक्षमता, बस कोड अस्तित्व का विश्लेषण नहीं करता है, इसलिए यह नहीं पता है कि। चूंकि कोई अन्य स्रोत उस वर्ग को संदर्भित नहीं करता है, इसलिए निष्पादन योग्य बनाते समय लिंकर इसे अस्तित्व से बाहर कर देता है। इसलिए जब Apple का कोड ऐसी कक्षा को लोड करने की कोशिश करता है, तो वह इससे जुड़ा कोड नहीं ढूंढ सकता है, और चेतावनी को प्रिंट करता है।
डिफ़ॉल्ट रूप से, Objective-C लक्ष्यों -all_load -ObjC
में डिफ़ॉल्ट रूप से सेट किए गए झंडे होंगे, जो सभी प्रतीकों को रखेंगे। लेकिन मैंने C ++ लक्ष्य के साथ शुरुआत की थी, और ऐसा नहीं था। फिर भी, मुझे इसके चारों ओर एक रास्ता मिला, जो लिंकर को आक्रामक रखता है।
मूल रूप से मैं जिस हैक का उपयोग कर रहा था वह खाली स्थिर दिनचर्या को जोड़ना था:
+(void)_keepAtLinkTime;
जो कुछ नहीं करता है, लेकिन मैं एक बार फोन करूंगा, जैसे:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
यह लिंकर को पूरी कक्षा को रखने के लिए मजबूर करेगा, और त्रुटि गायब हो जाती है।
जैसा कि jlstrecker ने टिप्पणियों में बताया, हमें वास्तव में एक _keepAtLinkTime
विधि जोड़ने की आवश्यकता नहीं है । बस एक मौजूदा एक को बुला रहा है, जैसे:
[MyClass class];
चाल करता है (जब तक आप एक से प्राप्त करते हैं NSObject
)।
बेशक, आप इसे अपने कोड के किसी भी स्थान पर कॉल कर सकते हैं। मुझे लगता है कि यह अनुपलब्ध कोड में भी हो सकता है। इस विचार को जोड़ने वाले को मूर्ख बनाने के लिए है जो MyClass
कहीं न कहीं उपयोग किया जाता है ताकि इसे बाहर अनुकूलित करने में इतना आक्रामक न हो।
दृश्य की स्विफ्ट परिभाषा। ओवरराइड करना सुनिश्चित करें init(coder aDecoder: NSCoder)
। उद्देश्य-सी व्यू कंट्रोलर की परिभाषा। और, एक नाशपाती के पेड़ में एक निब।
जहाँ आप अपनी कक्षा लेते हैं, वहां मॉड्यूल विवरण को Nib विवरण निरीक्षक में जोड़ें।
MyClass
। बस एक विधि को बुलाओ जो इसे विरासत में मिली है NSObject
, जैसे +class
।
MyClass.m
फ़ाइल इंस्पेक्टर के लक्ष्य सदस्यता अनुभाग में सभी आवश्यक लक्ष्यों की जांच कर सकते हैं ।
मैंने यह तय किया कि लौरा ने क्या सुझाव दिया था, लेकिन मुझे फाइलों को फिर से बनाने की जरूरत नहीं थी।
प्रोजेक्ट नेविगेटर में XCode 4 का उपयोग करते हुए, .m फ़ाइल का चयन करें जिसमें वह वर्ग है जिसके बारे में वह शिकायत कर रहा है
व्यू-> यूटिलिटीज-> शो फाइल इंस्पेक्टर पर जाएं
(यह फ़ाइल इंस्पेक्टर को दाईं ओर दिखाएगा , उसके साथ .m- फ़ाइल विचार)।
लक्ष्य सदस्यता अनुभाग खोलें और सुनिश्चित करें कि आपका लक्ष्य इस .m- फ़ाइल के लिए चुना गया है
जब मैंने अपनी परियोजना के लिए अपनी .m फ़ाइल जोड़ी, तो उसने इसे किसी कारण से मेरे डिफ़ॉल्ट लक्ष्य में नहीं जोड़ा और इससे मुझे आपके द्वारा बताई गई त्रुटि मिल गई।
यह वास्तव में इंटरफ़ेस बिल्डर के साथ कुछ भी नहीं है, यहाँ क्या हो रहा है कि प्रतीकों को आपके स्थिर पुस्तकालय से Xcode द्वारा लोड नहीं किया जा रहा है। इस समस्या को हल करने के लिए आपको प्रोजेक्ट (और संभवतः लक्ष्य) बिल्ड सेटिंग्स -all_load -ObjC
की Other Linker Flags
कुंजी में झंडे जोड़ने की आवश्यकता है ।
चूंकि ऑब्जेक्टिव-सी केवल एक प्रतीक प्रति वर्ग उत्पन्न करता है, इसलिए हमें -OjjC ध्वज का उपयोग करके लिंकर को कक्षा के सदस्यों को भी लोड करने के लिए बाध्य करना चाहिए, और हमें -all_load
लिंकर ध्वज को जोड़कर अपनी सभी वस्तुओं को अपने स्थैतिक पुस्तकालय से शामिल करने के लिए भी बाध्य करना चाहिए । यदि आप इन झंडों को जल्द ही छोड़ देते हैं या बाद में आप त्रुटि में चलेंगे unrecognized selector
या अन्य अपवाद प्राप्त करेंगे जैसे कि आपने यहां देखा है।
-ObjC
झंडे ने इसे मेरे मामले में तय किया है।
-ObjC
समस्या को ठीक करने के लिए उपयोग करना काफी अच्छा है।
मैं स्विफ्ट का उपयोग करके आज इस समस्या में चला गया।
मैंने एक वर्ग Model.h + Model.m
को बदल दिया Model.swift
। इस ऑब्जेक्ट का उपयोग इंटरफ़ेस बिल्डर में किया गया था class = Model
।
जैसे ही मैंने ऑब्जेक्ट को प्रतिस्थापित किया, क्लास को लोड नहीं किया जा सकता था।
आईबी में क्लास रेफरेंस बदलने के लिए मुझे क्या करना था:
Class = Model
Module =
सेवा
Class = Model
Module = <TARGETNAME>
आप <TARGETNAME>
बिल्ड सेटिंग्स में पाएंगे । यह वह नाम भी है जो आपके उत्पन्न स्विफ्ट-हैडर में दिखाई देता है:#import "TARGETNAME-Swift.h"
Module
ड्रॉप डाउन में नाम वहीं था। यह मेरे ऐप का नाम था।
"प्रोजेक्टनेम" पर जाएं, उस पर क्लिक करें और फिर "बिल्ड चरणों" टैब पर जाएं, और फिर "संकलन स्रोतों" पर क्लिक करें, और फिर "+" बटन पर क्लिक करें, एक विंडो दिखाई देगी, "MyClass" चुनें। एम "फ़ाइल और फिर" जोड़ें "पर क्लिक करें,
प्रोजेक्ट बनाएं और उसे चलाएं, समस्या निश्चित रूप से हल हो जाएगी
यह एक Xcode4 कैश समस्या है, बस के तहत सभी फ़ोल्डर्स को हटा दें / उपयोगकर्ता / your_user / पुस्तकालय / अनुप्रयोग समर्थन / iPhone सिम्युलेटर / / / /
अगर आपके iPhone पर भी यही समस्या है, तो पुराने ऐप को चलाने से पहले हटा दें ...
सौभाग्य। पास्कुअल
कभी-कभी IBuilder याद आती है customModule="AppName" customModuleProvider="target"
इसे ठीक करने के लिए, स्रोत कोड के रूप में स्टोरीबोर्ड खोलें और इस लाइन को बदलें:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
इसके लिए:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
customModule="MyFrameworkName"
। विशाल +10
मेरा मामला - मेरे उद्देश्य सी परियोजना में एक तेज रूपरेखा से एक वर्ग का उपयोग करने की कोशिश कर रहा है, मुझे यह त्रुटि मिली। समाधान इंटरफ़ेस बिल्डर / स्टोरीबोर्ड में वर्ग के मॉड्यूल (स्विफ्ट फ्रेमवर्क) को जोड़ना था जैसा कि नीचे दिखाया गया है। और कुछ नहीं
बिल्ड चरणों-> संकलन सूत्रों पर जाएं और अपनी नई .m फाइलें जोड़ें।
मेरे मामले में यह उस वर्ग के लिए एक त्रुटि दिखा रहा था जो मौजूद नहीं था! मुझे संदेह था कि यह कुछ ऐसा था जो स्टोरीबोर्ड फ़ाइल में अंकित हो गया था। यदि आप त्रुटि में वर्ग फ़ाइल को नहीं पहचानते हैं तो यह कोशिश करें:
1) उदात्त या किसी अन्य अच्छे संपादक में अपनी परियोजना खोलें। संदर्भित वर्ग के लिए खोजें। 2) पूरे बिट को हटा दें जो कहता है
customClass="UnrecognizedClassName"
3) इसे बचाओ। 4) xcode पर लौटें और प्रोजेक्ट को साफ़ करें, और इसे अभी चलाने का प्रयास करें।
मेरे लिए काम किया।
customClass="MyCla"
)। कस्टम क्लास असाइनमेंट को हटाने के बजाय, मेरे लिए यह समझदारी थी कि मैं जिस क्लास में पहली बार इस्तेमाल करने का इरादा रखता हूँ :)
मैं सिर्फ इस उत्तर को जोड़ना चाहता हूं क्योंकि यदि सभी उत्तर यहां नहीं हैं, तो यह माना जाता है कि वर्ग वास्तव में मौजूद है .. यह सिर्फ इतना है कि लिंकर / कंपाइलर इसे देखने के लिए बहुत गूंगा है .. इस प्रकार उत्तर या तो घूमने वाले को जोड़ने के लिए घूमता है, जो अस्तित्व के लिए लिंकर को सचेत करता है। वर्ग के लिए या 'बल' के लिए एक हैक बनाने यह मौजूद है ..
मेरी समस्या तब होती है जब यह संदेश वास्तव में एक गैर-मौजूद वर्ग के बारे में बात कर रहा होता है .. इसलिए एक उदाहरण मुझे एक पुराने गिट संशोधन के बारे में बताएगा जो कि एक निश्चित वर्ग का ज्ञान नहीं है .. फिर भी संकलक को शिकायत है कि उक्त वर्ग नहीं करता है ' टी मौजूद है ..
उपाय?
आपको उसके बाद जाना अच्छा होना चाहिए
त्रुटि को दूर करने का सबसे अच्छा तरीका है: 1) " लक्ष्य सदस्यता " के तहत , क्लास फ़ाइल (.m) 2 का चयन करें " प्रोजेक्ट नाम प्रविष्टि " "चेक" करें
मैंने अपने class.h और .m से पाठ की प्रतिलिपि बनाकर, प्रोजेक्ट से उन वर्ग फ़ाइलों को हटाकर, "Add File" का उपयोग करके उसी नाम से नई class.h और .m फाइलें बनाईं। फिर मैंने कोड को नई फ़ाइलों में वापस पेस्ट किया, और सब कुछ बहुत अच्छा काम किया। किसी तरह फ़ाइलों को सही ढंग से लिंक नहीं किया गया था जब वे बनाए गए थे। मुझे उसके बाद किसी भी लिंकर झंडे का उपयोग करने की आवश्यकता नहीं थी।
मैंने अंतिम रूप से यह तय किया था, मैं अपनी .m फ़ाइल में निम्न कोड जोड़ना भूल गया था:
@implementation MyTableViewCell
@end
तो ऐसा इसलिए हो रहा था क्योंकि मैंने अपने टेबल सेल के लिए प्लेसहोल्डर @ इनफ़र्टफेस बनाया था, जिसमें .xib फ़ाइल में एक तत्व का कनेक्शन था, लेकिन इंटरफ़ेस बिल्डर में एक बग है जहाँ यदि कोई क्लास के लिए @ कार्यान्वयन लागू नहीं किया गया है, तो यह नहीं मिल सकता है।
मैं .xib को स्रोत के रूप में देखने और MyTableViewCell को देखने के अन्य मंचों से सभी चरणों से गुजरा था, हालांकि मैंने इसे अपने कोड से बाहर टिप्पणी की थी। मैंने सिम्युलेटर को रीसेट करने की कोशिश की थी। मैंने अपनी सभी कक्षाओं को अलग-अलग फाइलों में तोड़ने की कोशिश की, जिन्हें इंटरफेस के नाम से जाना जाता है, लेकिन इसके बाद तक कुछ भी काम नहीं हुआ।
मेरे अनुभव में PS, इससे कोई फर्क नहीं पड़ता कि .h / .m फ़ाइलों के नाम @interface के नामों से अलग हैं। मेरे पास कई फाइलें हैं जिनमें एक से अधिक @ इंटर्फेस हैं और वे ठीक काम करती हैं।
PPS की मेरे पास अधिक विस्तृत व्याख्या है कि क्यों UITableViewCell और UICollectionViewCell इस त्रुटि का कारण https://stackoverflow.com/a/22797318/539149 है, साथ ही इसे रजिस्टर-क्लास का उपयोग करके संकलन-समय पर कैसे प्रकट किया जाए: forCellWithReuseIdentifier:।
ऐसा इसलिए होता है क्योंकि .xib को पुराने App प्रतिनिधि के लिए एक बासी कड़ी मिल गई है जो अब मौजूद नहीं है। मैंने इसे इस तरह तय किया:
मैंने यह कोशिश की, और अन्य, इस साइट पर सूचीबद्ध उत्तर, जिनमें से किसी ने भी इसे मेरे लिए हल नहीं किया। यह टिप्पणियां ( http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ने मदद की:
खोज और खोज और खोज के बाद, मैंने आखिरकार एक फ़ाइल में छिपे इस हटाए गए वर्ग का नाम खोज लिया। मुझे एक्स-कोड में इंटरफ़ेस बिल्डर फ़ाइलों को खोलना था, उन पर राइट क्लिक करके और 'सोर्स कोड के रूप में दृश्य' चुनकर। फिर उसे खोजते हुए ऊपर आया
<object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string> <string>*this was the class name*</string>
बस उस अंतिम पंक्ति को हटाने से दुर्भाग्य से ठीक नहीं होता है, यह शिकायत करते हुए कि फ़ाइल में गलत संख्या में आइटम हैं। आपको इसके ऊपर की पंक्तियों के अनुभाग में संबंधित लाइन को हटाने की आवश्यकता है, जो इसे संदर्भित करता है CustomClass
।
न केवल प्रोजेक्ट सेटिंग में, बल्कि टारगेट सेटिंग में भी u -all_load -ObjC झंडे लगाने होंगे ।।
कोर-प्लॉट: अज्ञात वर्ग CPLayerHostingView इंटरफ़ेस बिल्डर फ़ाइल में
यह समस्या पुरानी नहीं लगती है।
मैं Xcode 8 के साथ एक ही मुद्दा था और इसे स्माइलबोट की तरह परिचित हल कर दिया :
अपनी स्टोरीबोर्ड फ़ाइल को Xcode के भीतर "स्रोत कोड" के रूप में खोलें:
जिस वर्ग को संदर्भित किया जा रहा है उसे खोजें और जो पूरी बिट कहती है उसे हटा दें
customClass = "UnrecognizedClassName"
मेरे पास '' इंटरफ़ेस बिल्डर फ़ाइल में अज्ञात वर्ग favouritesButton '' है और इसे नीचे एक स्टोरीबुक दृश्य में ट्रैक किया गया है जहाँ प्रश्न में बटन में पहचान निरीक्षक के शीर्ष पर क्लास फ़ील्ड में "favouritesButton" का फर्जी कस्टम वर्ग था। मेरा मतलब उस मूल्य को अगले क्षेत्र में रखना है: पहचान लेबल।
इसे "UIButton" में बदलने से समस्या हल हो गई।
मैं स्विफ्ट में इस में भाग गया।
.Xib फ़ाइल को प्रोजेक्ट के Base.lproj फ़ोल्डर में ले जाने से इस त्रुटि से छुटकारा मिल गया।
जब मैं यूनिवर्सल के लिए Xcode 4 के तहत अपने aaLuminate ऐप को परिवर्तित कर रहा था, तो आज मुझे यह त्रुटि मिली। यह ऐप उपयोगिता टेम्पलेट पर आधारित है और मूल रूप से Xcode 3 के तहत बनाया गया था।
समय बचाने के लिए मैंने आईफ़ोन मेन और फ्लिपसाइड व्यूज़ को यूनिवर्सल ऐप पर उपयुक्त नामों में कॉपी किया। मुझे "इंटरफ़ेस बिल्डर फ़ाइल में अज्ञात वर्ग x" त्रुटि का अनुभव हुआ। मेरे मामले में यह XIB फ़ाइलों या लक्ष्यों में कुछ भी नहीं था।
मैंने अन्य कारणों से आनल्यूमिनट-इन्फो.प्लिस्ट फाइल को भी कॉपी किया था - इसमें मेनविंडो के लिए एक पुरानी कुंजी "मेन निब फाइल बेस नाम" था।
जैसे ही मैंने इस कुंजी को हटा दिया, इसने समस्या को ठीक कर दिया!
मेरे मामले में मुझे यह त्रुटि मिली क्योंकि मैंने एक नई परियोजना बनाकर कुछ कामों को बचाने की कोशिश की और फिर कई स्रोत फ़ाइलों को हटाकर उसी नाम के स्रोत फ़ाइलों को काम करने वाली परियोजना से कॉपी कर लिया। मैंने अपनी MainStoryBoard फ़ाइल की भी प्रतिलिपि बनाई जो कि मेरे RootViewController की तलाश में थी। हालाँकि, जब मैंने मूल RootViewController को हटा दिया था और फिर पिछले उत्पाद से RootViewController में जोड़ा गया था, तो जाहिर है कि Add Files ऑपरेशन ऊपर दिए गए सुझाव के अनुसार लक्ष्य बॉक्स को "चेक" करने में विफल रहा। केवल "आयात की गई सभी" .m "फ़ाइलों को हटाकर और सुनिश्चित करें कि लक्ष्य सदस्यता बॉक्स को चेक किया गया था, सब ठीक था। मुझे लगता है कि क्या हो रहा था कि स्टोरीबोर्ड फ़ाइल एक वर्ग की तलाश में थी जिसे लिंक से "बहिष्कृत" किया गया था क्योंकि लक्ष्य सदस्यता अनियंत्रित थी। यह सुनिश्चित करने के लिए कि लक्ष्य के लिए आवश्यक फाइलें लक्ष्य निरीक्षक में निर्दिष्ट हैं, फाइल इंस्पेक्टर ने चाल चली। धन्यवाद पैट! (ऊपर देखो)
मेरे मामले में ऐसा इसलिए था क्योंकि मैंने .h फ़ाइल में एक UITableView सेल के एक उपवर्ग का उपवर्ग घोषित किया था (दोनों उपवर्गों की घोषणा समान .h फ़ाइल में थी), लेकिन उस दूसरे उपवर्ग का एक खाली कार्यान्वयन करना भूल गया। .m फ़ाइल।
आप .h फ़ाइल में घोषित उपवर्ग के किसी भी उपवर्ग को लागू करने के लिए मत भूलना! अगर आप एक वर्ग प्रति .h / .m फ़ाइल के साथ काम कर रहे हैं तो सरल, लेकिन यह भूलना आसान है क्योंकि Xcode आपके लिए ऐसा करेगा।
मेरे पास "इंटरफ़ेस बिल्डर में अज्ञात वर्ग का रेट व्यू" था जहां रेट व्यू यूआईवीवाई का एक उपवर्ग था। मैंने अपने स्टोरीबोर्ड दृश्य पर एक UIView गिरा दिया था और कस्टम क्लास फ़ील्ड को रेट व्यू में बदल दिया। फिर भी, यह त्रुटि दिखाई दी।
डिबग करने के लिए, मैंने अपनी कक्षा का नाम बदलकर RateView2 कर दिया और UIView के कस्टम वर्ग फ़ील्ड को छोड़कर मिलान के सभी संदर्भ बदल दिए। त्रुटि संदेश अभी भी पहले के रूप में RateView लापता वर्ग के रूप में दिखाई दिया। इसने पुष्टि की कि त्रुटि संदेश कस्टम वर्ग फ़ील्ड के मान से संबंधित था। मैंने यह मान RateView2 में बदल दिया और त्रुटि संदेश "इंटरफ़ेस बिल्डर में अज्ञात वर्ग RateView2" में बदल गया। प्रकार की प्रगति।
अंत में, मैंने फाइल इंस्पेक्टर में खुद सोर्स कोड फाइलों का निरीक्षण किया। वहां मुझे पता चला कि सोर्स कोड फ़ाइल (जिसे मैंने एक ट्यूटोरियल से कॉपी किया था) मेरे टारगेट से जुड़ी नहीं थी। दूसरे शब्दों में, इसका कोई लक्ष्य सदस्यता नहीं था। मैंने उस बॉक्स को चेक किया जिसने कक्षा के स्रोत कोड फ़ाइल को लक्ष्य एप्लिकेशन का सदस्य बनाया और त्रुटि संदेश चला गया।
मेरे मामले में मैंने "viewController" नामक एक वर्ग को हटा दिया था, यह एहसास नहीं हुआ कि इसे स्टोरीबोर्ड के पहचान निरीक्षक ('कस्टम क्लास' के ऊपर) के साथ चुना गया था।
आपको बस अपने पहचान निरीक्षक के कस्टम क्लास फील्ड में व्यू कंट्रोलर के लिए सही क्लास का चयन करना है या अपने प्रोजेक्ट में एक नई क्लास जोड़ना है और उस एक को अपनी कस्टम क्लास के रूप में चुनना है।
मेरे लिए काम किया!
मैंने टार्गेट्स में बिल्ड अंडर फेज में फ़ाइल को जोड़ा और समस्या हल हो गई। फ़ाइल जोड़ने के चरणों के लिए, मेरा उत्तर यहां देखें:
इसने मुझे थोड़ा सा पागल कर दिया और ऊपर दिए गए किसी भी सुझाव ने मुझे त्रुटि से छुटकारा पाने में मदद नहीं की। सौभाग्य से मेरे पास कक्षा का उपयोग करने वाला केवल एक आईबी ऑब्जेक्ट था इसलिए मैंने इसे हटा दिया और इसे उसी वर्ग के साथ वापस जोड़ा। त्रुटि दूर हो गई ...