ios - DequeueReusableCellWithIdentifier में दावा विफलता: इंडेक्सपैथ के लिए:




objective-c uitableview (14)

स्विफ्ट 2.0 समाधान:

आपको अपने एट्रिब्यूट इंस्पेक्टर में जाना होगा और अपने सेल पहचानकर्ता के लिए एक नाम जोड़ना होगा:

फिर आपको अपने पहचानकर्ता मैच को अपने डेक्यू के साथ इस तरह बनाना होगा:

let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell

वैकल्पिक रूप से

यदि आप एक निब के साथ काम कर रहे हैं तो आपको अपनी कक्षा को अपने सेल में पंजीकृत करने की आवश्यकता हो सकती है ForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {       

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")

    // included for context            
    let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell

    //... continue    
}

सेब के यूआईटीबल व्यू क्लास रेफरेंस कहते हैं:

किसी भी कोशिका को हटाने से पहले, इस विधि या रजिस्टर को कॉल करें Nib: forCellReuseIdentifier: तालिका को बताने के लिए विधि नई कोशिकाओं को कैसे बनाएं। यदि निर्दिष्ट प्रकार का एक सेल वर्तमान में पुन: उपयोग कतार में नहीं है, तो तालिका दृश्य स्वचालित रूप से एक नई सेल ऑब्जेक्ट बनाने के लिए प्रदान की गई जानकारी का उपयोग करता है।

यदि आपने पहले एक ही पुन: उपयोग पहचानकर्ता के साथ कक्षा या nib फ़ाइल पंजीकृत की है, तो क्लास क्लास पैरामीटर में निर्दिष्ट क्लास पुरानी प्रविष्टि को प्रतिस्थापित करता है। यदि आप निर्दिष्ट पुन: उपयोग पहचानकर्ता से कक्षा को अपंजीकृत करना चाहते हैं तो आप सेल क्लास के लिए शून्य निर्दिष्ट कर सकते हैं।

एप्पल स्विफ्ट 2.0 ढांचे से कोड यहां दिया गया है:

// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.

@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)

@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

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

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                     forIndexPath:indexPath];
    if (cell == nil) {

        cell = 
         [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  
                                reuseIdentifier:CellIdentifier];

    }

आउटपुट में त्रुटि यहां दी गई है:

2012-10-04 20: 13: 05.356 रीडर [43 9 0: सी07] * में सम्मिलन विफलता - [UITableView dequeueReusableCellWithIdentifier: forndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04 20: 13: 05.357 रीडर [43 9 0: सी07] * अपरिपक्व अपवाद के कारण ऐप को समाप्त करना 'एनएसआईएननल इंटोनिस्टेंसी एक्सेप्शन', कारण: 'पहचानकर्ता सेल के साथ एक सेल को हटाने में असमर्थ - पहचानकर्ता के लिए एक निब या कक्षा पंजीकृत करना चाहिए या स्टोरीबोर्ड में प्रोटोटाइप सेल को कनेक्ट करना होगा '* प्रथम फेंक कॉल स्टैक: (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935) libc ++ abi.dylib: अपवाद फेंकने को समाप्त कर दिया गया है

और यह कोड है जो त्रुटि स्क्रीन में दिखाया गया है:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

कृपया सहायता कीजिए!


अपने स्टोरीबोर्ड में आपको अपने प्रोटोटाइप सेल के 'पहचानकर्ता' को अपने सेलर्यूजइडिएंटिफायर "सेल" के समान होना चाहिए। तब आपको वह संदेश नहीं मिलेगा या उस रजिस्टर को कॉल करने की आवश्यकता होगी क्लास: फ़ंक्शन।


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

static NSString *CellIdentifier = @"YourCellIdenifier";

केवल उत्तरों का एक पूरक: एक समय हो सकता है कि आप सभी चीजों को सही तरीके से सेट कर सकें, लेकिन आप गलती से कुछ अन्य यूआई जोड़ सकते हैं। .xib , .xib तरह: बस अतिरिक्त यूआई हटाएं, यह काम करता है।


मुझे वही समस्या बदल रही थी

static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell==nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    }

हल किया


मेरे पास एक ही समस्या थी, वही त्रुटि थी और मेरे लिए यह इस तरह काम करता था:

[self.tableView registerNib:[UINib nibWithNibName:CELL_NIB_HERE bundle: nil] forCellReuseIdentifier:CELL_IDENTIFIER_HERE];

शायद यह किसी और के लिए उपयोगी होगा।


मैं आपको उद्देश्य सी और स्विफ्ट दोनों में जवाब देता हूं। इससे पहले कि मैं कहना चाहता हूं

यदि हम dequeueReusableCellWithIdentifier:forIndexPath: उपयोग करते हैं dequeueReusableCellWithIdentifier:forIndexPath: हमें रजिस्टर का उपयोग कर कक्षा या nib फ़ाइल को पंजीकृत करना होगा: forCellReuseIdentifier: या registerClass: forCellReuseIdentifier: इस विधि को कॉल करने से पहले विधि Apple Documnetation कहते हैं

तो हम registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: जोड़ते registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:

एक बार जब हम निर्दिष्ट पहचानकर्ता के लिए कक्षा पंजीकृत कर लेते हैं और एक नया सेल बनाया जाना चाहिए, तो यह विधि सेल को अपने initWithStyle को कॉल करके प्रारंभ करती है: reuseIdentifier: method। निब-आधारित कोशिकाओं के लिए, यह विधि प्रदान की गई निब फ़ाइल से सेल ऑब्जेक्ट लोड करती है। यदि कोई मौजूदा सेल पुन: उपयोग के लिए उपलब्ध था, तो यह विधि इसके बजाय सेल की तैयारफॉररयूज़ विधि को कॉल करती है।

देखने में डीडलोड विधि हमें सेल पंजीकृत करना चाहिए

उद्देश्य सी

विकल्प 1:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

विकल्प 2:

[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];

उपरोक्त कोड में nibWithNibName:@"CustomCell" मेरे निब नाम के बजाय अपना निब नाम दें कस्टमसेल

स्विफ्ट

विकल्प 1:

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

विकल्प 2:

tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 

उपरोक्त कोड में nibName:"NameInput" अपना निब नाम दें


मैं बस उस dequeueReusableCellWithIdentifier:forIndexPath: 4.5 को जोड़ dequeueReusableCellWithIdentifier:forIndexPath: जिसमें नया dequeueReusableCellWithIdentifier:forIndexPath:
अपने डिफ़ॉल्ट टेम्पलेट कोड में - डेवलपर्स के लिए एक संभावित dequeueReusableCellWithIdentifier: जो पुरानी dequeueReusableCellWithIdentifier: विधि की अपेक्षा करता है।


मैंने स्टोरीबोर्ड में सबकुछ सही ढंग से सेटअप किया है और एक साफ निर्माण किया है लेकिन त्रुटि प्राप्त कर रही है " पहचानकर्ता के लिए एक निब या कक्षा पंजीकृत करनी चाहिए या स्टोरीबोर्ड में प्रोटोटाइप सेल को कनेक्ट करना चाहिए "

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

त्रुटि को ठीक किया लेकिन मैं अभी भी एक नुकसान में हूँ। मैं एक 'कस्टम सेल' का उपयोग नहीं कर रहा हूं, केवल एक दृश्यदृश्य के साथ एक दृश्य। मैंने व्यू कंट्रोलर को प्रतिनिधि और डेटासोर्स के रूप में घोषित कर दिया है और यह सुनिश्चित किया है कि सेल पहचानकर्ता फ़ाइल में मेल खाता है। यहाँ क्या चल रहा है?


यदि आप कस्टम स्टेटिक सेल के साथ जा रहे हैं तो बस इस विधि पर टिप्पणी करें:

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    static NSString *CellIdentifier = @"notificationCell";
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//    return cell;
//}

और स्टोरीबोर्ड में कोशिकाओं को "विशेषता निरीक्षक" पर एक पहचानकर्ता दें।


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


समस्या सबसे अधिक संभावना है क्योंकि आप स्टोरीबोर्ड में कस्टम UITableViewCell कॉन्फ़िगर करते हैं लेकिन आप अपने UITableViewController को तुरंत चालू करने के लिए स्टोरीबोर्ड का उपयोग नहीं करते हैं जो इस UITableViewCell का उपयोग करता है। उदाहरण के लिए, MyTableViewController में, आपके पास MyTableViewController उप MyTableViewController जिसे MyTableViewController कहा जाता है और इसमें एक कस्टम डायनामिक UITableViewCell जिसे पहचानकर्ता आईडी "MyCell" के साथ MyTableViewCell कहा जाता है।

यदि आप अपना कस्टम UITableViewController इस तरह बनाते हैं:

 MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];

यह आपके लिए स्वचालित रूप से आपकी कस्टम टेबलव्यूसेल पंजीकृत नहीं करेगा। आपको इसे मैन्युअल रूप से पंजीकृत करना होगा।

लेकिन अगर आप MyTableViewController को तुरंत चालू करने के लिए स्टोरीबोर्ड का उपयोग करते हैं, तो इस तरह:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard  instantiateViewControllerWithIdentifier:@"MyTableViewController"];

अच्छी बात होती है! UITableViewController स्वचालित रूप से आपके कस्टम टेबलव्यू सेल को पंजीकृत करेगा जिसे आपने अपने लिए स्टोरीबोर्ड में परिभाषित किया है।

अपने प्रतिनिधि विधि "cellForRowAtIndexPath" में, आप इस तरह टेबल व्यू सेल बना सकते हैं:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

//Configure your cell here ...

return cell;
}

रीसाइक्लिंग कतार में पुन: प्रयोज्य सेल उपलब्ध नहीं होने पर dequeueReusableCellWithIdentifier स्वचालित रूप से आपके लिए नया सेल बना देगा।

तब आप कर चुके हैं!


स्विफ्ट 3.0 के साथ काम करना:

override func viewDidLoad() {
super.viewDidLoad()

self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell

return cell
}

स्विफ्ट में इस समस्या को आपके द्वारा निम्नलिखित कोड जोड़कर हल किया जा सकता है

viewDidLoad

तरीका।

tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")