हटाने के बाद शून्य इंडेक्सपैथ के साथ बुलाया गया है, मेरे पास एक दिए गए कोर डेटा इकाई के सभी उदाहरण प्रदर्शित करने के लिए NSFetchedResultsController
द्वारा प्रबंधित एक वेनिला UITableView
है।तालिका दृश्य: सेलफोररोएट इंडेक्सपैथ आइटम
उपयोगकर्ता इस पर स्वाइप करके तालिका दृश्य में एक प्रविष्टि को हटाता है, tableView:cellForRowAtIndexPath:
अंततः एक nil
indexPath
के साथ मेरी UITableViewController
पर बुलाया जाता है। चूंकि मुझे उम्मीद नहीं थी कि इसे nil
indexPath
के साथ बुलाया जाए, ऐप क्रैश हो जाता है।
मैं उस nil
मान की जांच करके और फिर खाली सेल लौटकर क्रैश के आसपास काम कर सकता हूं। ऐसा लगता है, लेकिन मुझे अभी भी चिंता है कि मैंने कुछ गलत संभाला होगा। कोई विचार? क्या किसी ने कभी tableView:cellForRowAtIndexPath:
को nil
indexPath
से बुलाया है?
ध्यान दें कि यह तब होता है जब उपयोगकर्ता सेल पर स्वाइप करके तालिका दृश्य से हटा देता है। तालिका दृश्य संपादन मोड का उपयोग कर किसी आइटम को हटाते समय, ऐसा नहीं होता है। सेल को हटाने के दो तरीकों के बीच क्या अलग होगा?
तो क्या यह तालिका दृश्य प्रतिनिधि विधि में nil
indexPath
प्राप्त करने के लिए वास्तव में एक ठीक स्थिति है?
मेरा व्यू कंट्रोलर कोड वास्तव में मानक है।
- (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
द्वारा नियंत्रित किया जाता है यहाँ विलोपन है
बहुत धन्यवाद।
आपको यह सत्यापित किया इन सभी की भविष्यवाणी क्रम में कहा जाता हो सकते हैं? – Mundi
प्रबंधित तालिका संदर्भ में परिवर्तनों को सहेजने के बाद * तालिका दृश्य: प्रतिबद्ध संपादन विधि: forRowAtIndexPath' में * तालिका तालिका में 'reloadData' को कॉल करने का प्रयास करें। मुझे इसके साथ एक ही समस्या थी और तालिका दृश्य को फिर से लोड करना इसे ठीक कर दिया गया। – Greg