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




objective-c uitableview (17)

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

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

- (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]));
    }
}

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


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


सुनिश्चित करें कि सेलइडेंटिफायर == स्टोरीबोर्ड में सेल का पहचानकर्ता, दोनों नाम समान हैं। उम्मीद है कि यह आपके लिए काम करता है


आप dequeueReusableCellWithIdentifier:forIndexPath: का उपयोग कर रहे हैं dequeueReusableCellWithIdentifier:forIndexPath: विधि के लिए। उस विधि के लिए documentation यह कहता है:

महत्वपूर्ण: रजिस्ट्रार का उपयोग करके आपको कक्षा या निब फ़ाइल पंजीकृत करनी होगी registerNib:forCellReuseIdentifier: या registerClass:forCellReuseIdentifier: इस विधि को कॉल करने से पहले विधि।

आपने पुन: उपयोग पहचानकर्ता "Cell" लिए एक निब या कक्षा पंजीकृत नहीं की है।

अपने कोड को देखते हुए, आपको लगता है कि डेक्यू विधि nil वापस लौटने की उम्मीद है यदि उसके पास आपको देने के लिए कोई सेल नहीं है। आपको dequeueReusableCellWithIdentifier: का उपयोग करने की आवश्यकता है dequeueReusableCellWithIdentifier: उस व्यवहार के लिए:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

ध्यान दें कि dequeueReusableCellWithIdentifier: और dequeueReusableCellWithIdentifier:forIndexPath: विभिन्न विधियां हैं। पूर्व और बाद के लिए डॉक्टर देखें।

यदि आप समझना चाहते हैं कि आप कभी भी dequeueReusableCellWithIdentifier:forIndexPath: का उपयोग क्यों करना चाहते हैं dequeueReusableCellWithIdentifier:forIndexPath: इस क्यू एंड ए को देखें ।


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

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

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

    }

हल किया


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

viewDidLoad

तरीका।

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

मैंने कल रात घंटों बिताए कि मेरी प्रोग्रामेटिक रूप से जेनरेट की गई तालिका [myTable setDataSource: self] पर क्यों दुर्घटनाग्रस्त हो गई; यह ठीक से टिप्पणी कर रहा था और एक खाली टेबल पॉप अप कर रहा था, लेकिन जब भी मैंने डेटास्रोत तक पहुंचने की कोशिश की तो क्रैश हो गया;

मेरे पास एच फाइल में प्रतिनिधिमंडल स्थापित हुआ था: @interface myViewController: UIViewController

मेरे पास मेरे कार्यान्वयन में डेटा स्रोत कोड था और अभी भी BOOM !, हर बार क्रैश! आपको "xxd" (एनआर 9) के लिए धन्यवाद: कोड की उस पंक्ति को जोड़ने के लिए यह मेरे लिए हल हो गया! वास्तव में मैं एक आईबीएक्शन बटन से एक टेबल लॉन्च कर रहा हूं, इसलिए मेरा पूरा कोड यहां है:

    - (IBAction)tapButton:(id)sender {

    UIViewController* popoverContent = [[UIViewController alloc]init];

    UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
    popoverView.backgroundColor = [UIColor greenColor];
    popoverContent.view = popoverView;

    //Add the table
    UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)         style:UITableViewStylePlain];

   // NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when      tapping the button!

    [table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    table.delegate=self;
    [table setDataSource:self];
    [popoverView addSubview:table];
    popoverContent.contentSizeForViewInPopover =
    CGSizeMake(200, 300);

    //create a popover controller
    popoverController3 = [[UIPopoverController alloc]
                          initWithContentViewController:popoverContent];
    CGRect popRect = CGRectMake(self.tapButton.frame.origin.x,
                                self.tapButton.frame.origin.y,
                                self.tapButton.frame.size.width,
                                self.tapButton.frame.size.height);


    [popoverController3 presentPopoverFromRect:popRect inView:self.view   permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];



   }


   #Table view data source in same m file

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
    NSLog(@"Sections in table");
    // Return the number of sections.
    return 1;
   }

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
  {
    NSLog(@"Rows in table");

    // Return the number of rows in the section.
    return myArray.count;
   }

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

    NSString *myValue;

    //This is just some test array I created:
    myValue=[myArray objectAtIndex:indexPath.row];

    cell.textLabel.text=myValue;
    UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
    cell.textLabel.font  = myFont;

    return cell;
   }

वैसे: यदि आप पॉपओवर को एंकर करना चाहते हैं तो बटन को आईबीएक्शन के रूप में और आईबीओलेट के रूप में जोड़ा जाना चाहिए।

UIPopoverController * popoverController3 को {@ के बीच @interface के बाद सीधे एच फ़ाइल में घोषित किया गया है {}


स्विफ्ट 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)

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

static NSString *CellIdentifier = @"YourCellIdenifier";

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


यद्यपि यह प्रश्न काफी पुराना है, फिर भी एक और संभावना है: यदि आप स्टोरीबोर्ड का उपयोग कर रहे हैं, तो आपको स्टोरीबोर्ड में सेलइडिएंटिफायर सेट करना होगा।

तो यदि आपका सेलइडिएंटिफायर "सेल" है, तो बस "पहचानकर्ता" संपत्ति सेट करें:

ऐसा करने के बाद अपने निर्माण को साफ करना सुनिश्चित करें। XCode में कभी-कभी स्टोरीबोर्ड अपडेट के साथ कुछ समस्याएं होती हैं


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


मुझे लगता है कि यह त्रुटि पहचानकर्ता के लिए अपने निब या कक्षा को पंजीकृत करने के बारे में है।

ताकि आप अपनी तालिका में जो कर रहे हैं उसे रख सकें दृश्य: cellForRowAtIndexPath फ़ंक्शन और बस अपने दृश्य में नीचे कोड जोड़ेंडिडलोड:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"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 स्वचालित रूप से आपके लिए नया सेल बना देगा।

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


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

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

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


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

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

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


मैंने एक नया नमूना समाधान बनाया है क्योंकि पिछले उत्तर आधुनिक उपयोग के लिए पुराना नहीं है।

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

प्रत्येक पंक्ति की ऊंचाई को गिनने के बजाय, जो अतिरिक्त कार्य का कारण बनता है, इस कोड को अंतिम पंक्ति के लिए फ्रेम मिलता है ताकि शीर्ष से सामग्री इन्सेट की गणना की जा सके। यह लीवरेज करता है कि टेबल व्यू पहले से क्या कर रहा है इसलिए कोई अतिरिक्त काम जरूरी नहीं है।

कीबोर्ड या अन्य ओवरले के लिए नीचे इन्सेट सेट होने पर यह कोड केवल शीर्ष इन्सेट सेट करता है।

कृपया किसी भी बग की रिपोर्ट करें या गिटहब पर सुधार जमा करें और मैं इस नमूना को अपडेट करूंगा।

गिटहब: https://github.com/brennanMKE/BottomTable

- (void)updateContentInsetForTableView:(UITableView *)tableView animated:(BOOL)animated {
    NSUInteger lastRow = [self tableView:tableView numberOfRowsInSection:0];
    NSUInteger lastIndex = lastRow > 0 ? lastRow - 1 : 0;

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:lastIndex inSection:0];
    CGRect lastCellFrame = [self.tableView rectForRowAtIndexPath:lastIndexPath];

    // top inset = table view height - top position of last cell - last cell height
    CGFloat topInset = MAX(CGRectGetHeight(self.tableView.frame) - lastCellFrame.origin.y - CGRectGetHeight(lastCellFrame), 0);

    UIEdgeInsets contentInset = tableView.contentInset;
    contentInset.top = topInset;

    UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState;
    [UIView animateWithDuration:animated ? 0.25 : 0.0 delay:0.0 options:options animations:^{
        tableView.contentInset = contentInset;
    } completion:^(BOOL finished) {
    }];
}






ios objective-c uitableview