2012-03-21 12 views
5

मैंने स्टोरीबोर्ड फ़ाइल में पहचानकर्ता "mainViewTableCell" के साथ एक प्रोटोटाइप सेल बनाया है और "NTTableViewController" नामक एक कस्टम नियंत्रक वर्ग के साथ मुख्य तालिका दृश्य को जोड़ा है। इस प्रकार मैं NTTableViewController.m में समारोह "tableView cellForRowAtIndexPath" को क्रियान्वित किया है:dequeueReusableCellWithIdentifier से शून्य प्राप्त करना जारी रखें?


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* MAINVIEW_CELLIDENTIFIER = @"mainViewTableCell"; 
    UITableViewCell *newCell = [tableView dequeueReusableCellWithIdentifier: MAINVIEW_CELLIDENTIFIER]; 

    if (newCell == nil) { 
     newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; 
     [newCell autorelease]; 
     newCell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    NTContactItem* currentItem = [self.contactItemContainer objectInContainerAtIndex: indexPath.row]; 
    NSString* firstName = currentItem.firstName; 
    NSString* lastName = currentItem.lastName; 

    NSString* fullName = [firstName stringByAppendingFormat: lastName];  
    [newCell.textLabel setText: fullName]; 
    [newCell.detailTextLabel setText: currentItem.mobilePhone]; 

    return newCell; 
} 

लेकिन मैं dequeueReusableCellWithIdentifier से नहीं के बराबर हो रही रखने और सेल का एक नया उदाहरण हर बार बनाने के लिए किया है।

फिर, क्या गलत है?

कोड: project

आप सभी पहले से धन्यवाद।

+0

क्या आप वास्तव में यह एक ही स्ट्रिंग के लिए इस प्रोटोटाइप सेल के लिए पहचानकर्ता सेट हैं स्टोरीबोर्ड में? –

+0

@FirozeLafeer मुझे यकीन है। असल में मैंने पहली बार जांच की जब मुझे समस्या मिली। –

उत्तर

26

स्टोरीबोर्ड और टेबलव्यू के साथ प्रोटोटाइप कोशिकाएं हैं, [tableView dequeueReusableCellWithIdentifier:] शून्य वापस नहीं आनी चाहिए। यहां तक ​​कि यदि यह पहला सेल है, और पुन: उपयोग कतार में पहले से मौजूद कोई भी कक्ष नहीं है, तो टेबलव्यू आपके प्रोटोटाइप सेल का एक नया उदाहरण बनाएगा और उसे वापस कर देगा।

आपके मामले में, समस्या कुछ अलग थी (मैंने आपकी परियोजना को डाउनलोड किया क्योंकि मैं वास्तव में उत्सुक था)।

अपने application:didFinishLaunchingWithOptions: विधि में अपने एप्लिकेशन के प्रतिनिधि में, आप इस tableviewcontroller को फिर से शुरू कर रहे हैं। जब आप [masterController init] पर कॉल करते हैं, तो यह [super init] पर कॉल करता है, जो बदले में [UITableViewController initWithStyle:] पर कॉल करता है।

यह नियंत्रक को एक नया UITableView बनाने का कारण बनता है, जो आपके स्टोरीबोर्ड में से एक से अलग है। उस नए यूआईटीबल व्यू में कोई प्रोटोटाइप सेल नहीं है, और इसलिए dequeueReusableCellWithIdentifier: वापस लौट रहा है।

पाठ्यक्रम का सबक एक उद्देश्य-सी ऑब्जेक्ट को फिर से शुरू नहीं करना है जिसे पहले ही शुरू किया जा चुका है। जब आपकी तालिका दृश्य नियंत्रक स्टोरीबोर्ड से लोड होता है, तो लोडिंग तंत्र इसे initWithCoder: के साथ प्रारंभ करेगा। इसलिए यदि आपको कुछ कस्टम प्रारंभिक कार्य करने की आवश्यकता है (जैसे कि आपके मामले में उस एनएसएमयूटेबलएरे को सेट करना), तो बस initWithCoder: और/या awakeFromNib ओवरराइड करें।

आप इन विधियों को आवश्यकतानुसार ओवरराइड कर सकते हैं, लेकिन उन्हें स्वयं कॉल करें। initWithCoder: और awakeFromNib दोनों स्टोरीबोर्ड/निब लोडिंग तंत्र द्वारा बुलाए जाएंगे।

यदि सबकुछ सही है, तो आपको प्रोग्राम को प्रोग्रामेटिक रूप से यहां बनाने की आवश्यकता नहीं है। कोड के इस बिट की आवश्यकता नहीं होनी चाहिए:

// This bit is unnecessary with storyboards:  
if (newCell == nil) { 
    newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; 
    [newCell autorelease]; 
    newCell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 

आशा है कि मदद करता है।

+0

सब कुछ ठीक काम करता है। [मास्टर कंट्रोलर इनिट] को कॉल करने का कारण मुझे पता चला है कि मास्टर कंट्रोलर की इनिट को बिल्कुल नहीं कहा गया था, जिससे एनएसएमयूटेबलएरे संपत्ति को अनियंत्रित किया गया था। मुझे पता नहीं था कि initWithCoder init के समान ही कर सकता है और इसे स्टोरीबोर्ड की लोडिंग की प्रक्रिया के दौरान स्वचालित रूप से कॉल किया जाएगा। और मुझे स्टोरीबोर्ड/निब फ़ाइल के लोडिंग तंत्र के बारे में अधिक जानने की जरूरत है। धन्यवाद! –

+0

यह मुझे पूरे दिन पागल कर रहा था। मैं एक स्रोत सेग्यू से स्टोरीबोर्ड से पहले एक कस्टम इनिट (स्टोरीबोर्ड से पहले पुराना स्रोत) कह रहा था, जो कि तालिका को पुनर्निर्मित कर रहा था जैसा कि यहां दिखाया गया है। एक बार जब मैं readyForSegue विधि का उपयोग कर मानों को पार कर गया तो मेरे सभी पुन: उपयोग करने वाले इंडेंटिफायरों ने ठीक से काम किया। धन्यवाद Firoze! –

+0

मुझे एक ही समस्या थी, और मैंने स्टोरीबोर्ड instatiateViewControllerWithIdentifier का उपयोग करके अपने tableviewcontroller को तुरंत चालू किया: और अब सब ठीक काम करता है – Claus

1

तालिका कक्ष केवल छिपे हुए होने पर पुन: प्रयोज्य हो जाते हैं, इसलिए आपके पास केवल उन कक्षों की संख्या होनी चाहिए जिन्हें आप वर्तमान में स्मृति में प्रदर्शित कर रहे हैं। आप कितने सेल्स प्रदर्शित कर रहे हैं, और कितने आवंटित किए गए हैं?

+0

मैंने एक्सकोड द्वारा प्रदान किए गए "मास्टर-विस्तार अनुप्रयोग" टेम्पलेट का उपयोग करके एक नई परियोजना बनाई है। फंक्शन डेक्यू रीयूसेबल कैलविथ इंडेंटिफायर ने कुछ वापस किया लेकिन शून्य जब पहली सेल बनाया गया। ऐसा क्यों? –

2

@ फिरोज़ के जवाब पढ़ने के बाद मैंने अपनी समस्या तय की जो मुझे दिनों के लिए परेशान कर रहा था .. और एक और समाधान मिला। मुझे पता है कि सवाल का जवाब पहले ही दिया जा चुका है लेकिन इससे किसी की मदद मिल सकती है।

मेरे मामले में मैंने कुछ रिफैक्टरिंग (एक नया टेबल व्यू कंट्रोलर निकाला) किया था, और बाद में मुझे dequeueReusableCellWithIdentifier से वापस लौटाया गया था।-

1

बस में

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" 
               bundle:nil]; 

MyTableViewController* controller = [sb instantiateViewControllerWithIdentifier: 
            @"MyTableViewController"]; 

(शायद स्पष्ट तरीका नहीं है, लेकिन यह काम करता है तो मैं फोन [self.navigationController pushViewController:controller animated:YES];):

मेरे लिए ठीक बजाय didSelectRowAtIndexPath में मेरी ViewController पर alloc/init बुलाने की यह करने के लिए था अगर यह भविष्य में किसी की मदद कर सकता है ... मेरे मामले में मैं "स्टेटिक सेल" से "डायनामिक प्रोटोटाइप" तक टेबल व्यू (स्टोरीबोर्ड) सामग्री में बदलना भूल गया था।

0

विशिष्ट कारण:

[tableView dequeueReusableCellWithIdentifier: @"id"]; Xcode से मेल नहीं खाता> गुण निरीक्षक>तालिका देखें सेल>पहचानकर्ता> आईडी