2010-06-19 5 views
9

मुझे अपने UITableViewController या NSFetchedResultsController के साथ एक छोटी सी समस्या है। मुझे यकीन नहीं है कि समस्या क्या है, लेकिन मुझे लगता है कि यह UITableViewController है।UITableViewController या NSFetchedResultsController को रीफ्रेश कैसे करें?

जैसा कि मैंने कहा था कि मैं अपने डेटा को UITableViewController में भरने के लिए एक NSFetchedResultsController का उपयोग करता हूं। डेटा तिथि के आधार पर क्रमबद्ध किया जाता है और दिनांक-वर्ष तक अनुभागों में भी प्रदर्शित होता है, उदा। मई 2010/जून 2010/और इसी तरह। यह अनुभाग हेडर के रूप में प्रदर्शित होता है।

अब जब मैं नया डेटा जोड़ता हूं, तो यह स्वचालित रूप से वर्तमान दिनांक को डिफ़ॉल्ट रूप से उपयोग करता है, लेकिन यदि मैं किसी दिनांक का उपयोग करना चाहता हूं, जो वर्तमान में अनुभाग सूची में नहीं है, उदा। अप्रैल 2010 (वर्तमान में सूची में मई और जून), तो यह सही ढंग से प्रदर्शित नहीं होता है। केवल जब मैं ऐप छोड़ देता हूं और इसे फिर से शुरू करता हूं तो यह नया सेक्शन हेडर दिखाएगा और सब कुछ ठीक है।

तो मुझे किसी भी तरह से मेरी सूची रीफ्रेश करने या इसे अपडेट करने में सक्षम होना चाहिए। इसे संदर्भ में जोड़कर और इसे बदलकर इसे अपडेट नहीं किया जा रहा है।

फिर से, मुझे यकीन नहीं है कि मुझे अपडेट करने की आवश्यकता है, अगर यह मेरा NSFetchedResultsController ऑब्जेक्ट या UITableViewController है।

अद्यतन # 1:

मैं बस सोचा इस विधि में एक अपवाद है कि वहाँ:

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

} 

यह वह जगह है जहाँ मैं डेटा को स्थानांतरित:

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

    UITableView *tableView = self.tableView; 

    switch(type) 
    { 

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

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

     case NSFetchedResultsChangeUpdate: 
     // [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 

      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
      [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 

इस विधि बहुत है ऐप्पल से CoreDataBooks उदाहरण से बहुत कुछ लिया गया। और यह त्रुटि है:

गंभीर एप्लिकेशन त्रुटि। प्रतिनिधिमंडल से कॉल-नियंत्रक DidChangeContent: के दौरान अपवाद पकड़ा गया था। *** - [NSMutableArray removeObjectAtIndex:]: सीमा से परे सूचकांक 1 [0 .. 0] के साथ userInfo (शून्य)

और उसके बाद, संपादन मोड (जहां हटाएँ बटन दिखाई देता है) काम नहीं करता है अब और।

धन्यवाद।

उत्तर

0

आपको controller:didChangeSection:atIndex:forChangeType: प्रतिनिधि विधियों को लागू करने की आवश्यकता है। इसमें, रिपोर्ट किए गए परिवर्तन प्रकार के आधार पर insertSections:withRowAnimation:, deleteSections:withRowAnimation:, और reloadSections:withRowAnimation: संदेशों को अपने तालिका दृश्य में भेजें।

+0

जो मैंने प्रश्न में जोड़ा है ..., इसके बाद अपवाद आता है। – elementsense

+0

आप 'नियंत्रक का भी उल्लेख नहीं कर रहे हैं: didChangeSection: atIndex: forChangeType: '। –

+0

isnt-controller: didChangeObject: atIndexPath: forChangeType: newIndexPath वही कर रहा है? – elementsense

15

ठीक है, जैसे मैं एक समाधान मिल गया है, मैं तो बस इन

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

छोड़ सकते हैं और हमेशा ऐसा करते हैं लग रहा है।

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 

[self.tableView reloadData]; 

} 

मैं स्पष्ट रूप से के बाद से समस्या केवल occures जब मैं एक अनुभाग है कि पहले मौजूद नहीं है में अपने डेटा ले जाना चाहते हैं, इस में कुछ और तर्क दे देंगे। जब तक कोई मुझे असली समाधान नहीं दे सकता, मैं इसके साथ जाऊंगा।

+3

मैंने डब्ल्यूडब्ल्यूडीसी में इस बारे में एक ऐप्पल इंजीनियर से बात की। उन्होंने कहा कि यह UITableView में एक बग था (जिसे 4.0 में तय किया गया है)। यदि आप <4.0 पर हैं, तो बस उस तरह 'reloadData' पर कॉल करें। यदि आप> = 4.0 पर हैं, तो इसे दस्तावेज़ीकरण की तरह करें। –

+0

धन्यवाद, पूरी तरह से काम करें .. – tesmojones

+1

आप महोदय, बस एक समस्या हल की जो 6 वें घंटे में खून बह रहा था। अगर मैं दो बार ऊपर उठ सकता था, तो मैं चाहता था। – Cyprus106

2

संस्करण 1 में iPhoneCoreDataRecipes में ऐप्पल द्वारा फिक्स को अपनाने।2, क्या करना उचित बात के साथ

[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

// Reloading the section inserts a new row and ensures that titles are updated appropriately. 
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

को बदलने के लिए, वहाँ 1.2 संस्करण में एक और ठीक है कि अनियमित क्रैश होने से बचाता है जब बनाने है (FileMerge अपने दोस्त है!)

नोट नयी प्रविष्टियां। मैंने इसकी सूचना दी थी और इसे दो सप्ताह के भीतर तय किया गया था। मैं आपको ऐप्पल के साथ बग रिपोर्ट दर्ज करने के लिए प्रोत्साहित करता हूं। वे आपके विचार से कहीं अधिक प्रतिक्रियाशील हैं, और आप सबसे अच्छा संभव फिक्स प्राप्त करने की उम्मीद कर सकते हैं।