2012-04-03 6 views
8

होना चाहिए, मैं एक कस्टम UITableViewCell का उपयोग कर रहा हूं। जब मैं अपने कोड चलाने का प्रयास है, मैं इस अपवाद ढेर हो गया और मैं समस्या के स्रोत को समझ में नहीं कर सकते हैं:पहचानकर्ता ((शून्य) के लिए पंजीकृत अमान्य निब) - nib में बिल्कुल एक शीर्ष स्तर

terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier ((null)) - nib must contain exactly one top level object which must be a UITableViewCell instance' 

कृपया ध्यान दें मैं स्टोरीबोर्ड का उपयोग नहीं कर रहा हूँ।

संपादित करें:

यह मेरा प्रासंगिक कोड है जो ब्रेकप्वाइंट के अनुसार समस्या का कारण है:

[tableviewSupport registerNib:[UINib nibWithNibName:@"HotelCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CustomCellCId]; 
+0

मैं सुझाव देता हूं कि डीबगिंग उद्देश्यों के लिए दो कोड कोड तोड़ने का सुझाव दें। UINib ऑब्जेक्ट को एक चर में लोड करें और जांच करें कि क्या इसे पंजीकृत करने से पहले यह सफल था या नहीं। –

उत्तर

1

मैं काफी यकीन है कि आप अपनी प्रदान की कोड में करने के लिए कोशिश कर रहे हैं नहीं कर रहा हूँ। आप तालिका में अपना निब अनलोड करेंगे दृश्य: cellForRowAtIndexPath:। आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Assuming you set a reuse identifier "cellId" in the nib for your table view cell... 
    HotelCell *cell = (HotelCell *)[tableView dequeueReusableCellWithIdentifier:@"cellId"]; 
    if (!cell) { 
     // If you didn't get a valid cell reference back, unload a cell from the nib 
     NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"HotelCell" owner:nil options:nil]; 
     for (id obj in nibArray) { 
      if ([obj isMemberOfClass:[HotelCell class]]) { 
       // Assign cell to obj 
       cell = (HotelCell *)obj; 
       break; 
      } 
     } 
    } 

    return cell; 
} 

अब, त्रुटि आप पोस्ट के आधार पर, IOS श्रेणी में एक ही वस्तु की उम्मीद कर रहा है, इसलिए पाश के लिए अनावश्यक हो सकता है। मैंने यह जांच करके यह किया है कि [nibArray count] == ​​1 और फिर ऑब्जेक्ट को पकड़ना ATIndex: 0 और इसे लूपिंग के बजाय सेल में असाइन करना, और यह भी काम करता है। लेकिन, अगर एक दिन ऐप्पल उस निब्रायरे में कुछ और छड़ी करने का फैसला करता है, तो एक लूप आपको इसके खिलाफ सुरक्षा देता है।

+0

यदि आप IOS6 का उपयोग करते हैं, तो dequeueReusableCellWithIdentifier का प्रयास करें: इंडेक्सपैथ के लिए: और खुश रहें। यह सत्यापित करने के लिए कि क्या सेल अब आवश्यक नहीं है – seufagner

0

यह ओपी के प्रश्न का उत्तर नहीं हो सकता है, लेकिन मुझे एक अलग समाधान के साथ एक ही त्रुटि थी, इसलिए मैं इसके बाद आने वाले गुगलर्स के लिए इस प्रश्न का उत्तर दूंगा।

I में मेरे XIB में एक UITableViewCell (वास्तव में, मेरा स्वयं का सबक्लास) है - इसलिए मुझे समझ में नहीं आया कि यह क्यों काम नहीं कर रहा था।

आप एक ही UITableViewCell या उपवर्ग के साथ एक XIB फ़ाइल बना ली है जब (उदाहरण के लिए यदि आप कम पर पुस्तकालय से एक UITableViewCell पर खींचें दाएं), इंटरफ़ेस बिल्डर आप एक पता चलता है:

कुंजी हो रहा है इंस्पेक्टर टैब के "टेबल व्यू सेल" अनुभाग के तहत विकल्प।

मैं आमतौर पर एक UIView बनाने और अपने यूआईटीबल व्यूसेल सबक्लास में अपना प्रकार बदलता था, इसलिए मैंने कभी उस विकल्प को नहीं देखा था।

यह वहाँ है कि आप पहचानकर्ता टाइप करने के लिए (और साथ ही अपने registerNib:withReuseIdentifer: कॉल में) की जरूरत है।

यह अनुभव करते समय मेरे लिए अधिक निराशाजनक यह था कि यह हर समय, केवल पहली बार दुर्घटनाग्रस्त नहीं हुआ। अजीब।

29

एक अन्य समाधान:

मैं UITableViewCell था, लेकिन मेरी XIB में एक अतिरिक्त वस्तु, एक लेबल जो मैं गलत था नहीं था।

तो अपने XIB को ध्यान से जांचें ताकि यह सुनिश्चित किया जा सके कि बाईं ओर ऑब्जेक्ट तालिका में केवल एक वस्तु है।

enter image description here

+0

हाँ, मेरे पास एक बटन था बस वहां बैठे –

+0

धन्यवाद, यह उत्तर केवल निराशाजनक डिबगिंग के लगभग तीन घंटे तक समाप्त हो गया है। मैंने सोचा कि मैंने आईबी जेनरेट की गई फ़ाइल से डिफ़ॉल्ट दृश्य हटा दिया है, लेकिन पता चला है कि मैंने इसे छुपाया था। –

+1

वाह। यह एक क्लासिक उदाहरण है कि डिबगिंग के घंटों को बचाने में आपकी मदद करने में कुछ आसान कैसे हो सकता है। धन्यवाद। – holydevil

0

मेरे मामले में मैं नाम वर्ग के साथ एक गुण सेट (उदाहरण के लिए: @property (मजबूत, nonatomic) IBOutlet UILabel * वर्ग) tableviewcell में, इस उल्लेख त्रुटि ऊपर देते हैं, तो नाम "वर्ग" है उद्देश्य सी प्रकार नहीं, परिवर्तन (कक्षा = वर्गबीसी) उपरोक्त मुद्दे को हल करें।

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