2011-08-04 22 views
15

हटाने के बाद शून्य इंडेक्सपैथ के साथ बुलाया गया है, मेरे पास एक दिए गए कोर डेटा इकाई के सभी उदाहरण प्रदर्शित करने के लिए NSFetchedResultsController द्वारा प्रबंधित एक वेनिला UITableView है।तालिका दृश्य: सेलफोररोएट इंडेक्सपैथ आइटम

उपयोगकर्ता इस पर स्वाइप करके तालिका दृश्य में एक प्रविष्टि को हटाता है, tableView:cellForRowAtIndexPath: अंततः एक nilindexPath के साथ मेरी UITableViewController पर बुलाया जाता है। चूंकि मुझे उम्मीद नहीं थी कि इसे nilindexPath के साथ बुलाया जाए, ऐप क्रैश हो जाता है।

मैं उस nil मान की जांच करके और फिर खाली सेल लौटकर क्रैश के आसपास काम कर सकता हूं। ऐसा लगता है, लेकिन मुझे अभी भी चिंता है कि मैंने कुछ गलत संभाला होगा। कोई विचार? क्या किसी ने कभी tableView:cellForRowAtIndexPath: को nilindexPath से बुलाया है?

ध्यान दें कि यह तब होता है जब उपयोगकर्ता सेल पर स्वाइप करके तालिका दृश्य से हटा देता है। तालिका दृश्य संपादन मोड का उपयोग कर किसी आइटम को हटाते समय, ऐसा नहीं होता है। सेल को हटाने के दो तरीकों के बीच क्या अलग होगा?

तो क्या यह तालिका दृश्य प्रतिनिधि विधि में nilindexPath प्राप्त करने के लिए वास्तव में एक ठीक स्थिति है?

मेरा व्यू कंट्रोलर कोड वास्तव में मानक है।

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the row from the data source 
     NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
     [self.moc deleteObject:managedObject]; 
     NSError *error = NULL; 
     Boolean success = [self.moc save:&error]; 
     if (!success) { <snip> } 
     // actual row deletion from table view will be handle from Fetched Result Controller delegate 
     // [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else { <snip> } 
} 

यह NSFetchedResultsController प्रतिनिधि विधि को बढ़ावा मिलेगा बुलाया जा रहा है:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 
:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
    newIndexPath:(NSIndexPath *)newIndexPath 
{ 
    UITableView *tableView = self.tableView; 
    switch(type) { 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

     case NSFetchedResultsChangeInsert: <snip> break; 
     case NSFetchedResultsChangeUpdate: <snip> break; 
     case NSFetchedResultsChangeMove: <snip> break; 
    } 
} 

और बेशक, डेटा स्रोत के तरीकों, जैसे NSFetchedResultsController द्वारा नियंत्रित किया जाता है यहाँ विलोपन है

बहुत धन्यवाद।

+1

आपको यह सत्यापित किया इन सभी की भविष्यवाणी क्रम में कहा जाता हो सकते हैं? – Mundi

+1

प्रबंधित तालिका संदर्भ में परिवर्तनों को सहेजने के बाद * तालिका दृश्य: प्रतिबद्ध संपादन विधि: forRowAtIndexPath' में * तालिका तालिका में 'reloadData' को कॉल करने का प्रयास करें। मुझे इसके साथ एक ही समस्या थी और तालिका दृश्य को फिर से लोड करना इसे ठीक कर दिया गया। – Greg

उत्तर

0

मैं ऐसा करूँगा, क्योंकि आप सीधे अपने प्रबंधित संदर्भ से तालिका को पॉप्युलेट कर रहे हैं, क्यों हटाए गए पहले ऑब्जेक्ट को प्रबंधित संदर्भ से हटाएं और फिर reloadData का उपयोग करके संदर्भ से तालिका को तुरंत अद्यतन करें। लेकिन अपने दृष्टिकोण का उपयोग कर मैं तुम्हें beginUpdates और endUpdates जोड़ने की जरूरत है लगता है:

#pragma mark - 
#pragma mark Fetched results controller delegate 


- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
[self.tableView beginUpdates]; 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
     atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 

switch(type) { 
    case NSFetchedResultsChangeInsert: 
     [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeDelete: 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
} 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
    newIndexPath:(NSIndexPath *)newIndexPath { 

UITableView *tableViews = self.tableView; 

switch(type) { 

    case NSFetchedResultsChangeInsert: 
     [tableViews insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeDelete: 
     [tableViews deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeUpdate: 
     [_delegate configureCell:[tableViews cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     [tableViews deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [tableViews insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
} 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:indexPath 
         atScrollPosition:UITableViewScrollPositionMiddle 
           animated:NO]; 
} 
2

ऐसा लगता है कि आप से तालिका लेकिन तालिका डेटा स्रोत को अद्यतन करने नहीं है indexPath हटा रहे हैं। क्या आपने NSFetchedResultsController द्वारा डेटा स्रोत उडेशन प्रक्रिया को सत्यापित किया है, तालिका डेटा स्रोत को सही ढंग से अद्यतन कर रहा है।

-1

मैं तालिका दृश्यों में कोरडाटा का उपयोग करता हूं और उपयोगकर्ताओं को रिकॉर्ड हटाने और उन्हें हर समय अपडेट करने की अनुमति देता हूं, मेरे पास आपके द्वारा उल्लिखित समस्या का सामना किए बिना 4 ऐप्स में हैं।

मैं अपने कोड में इन FetchedResultsController प्रतिनिधि विधि है

 - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates. 
    [self.myTableView beginUpdates]; 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
     [self.myTableView endUpdates]; 

}

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