2010-08-29 18 views
9

मेरा टेबल व्यू उपयोगकर्ताओं की एक सूची दिखाता है। मुझे उपयोगकर्ता जोड़ने के बाद मेरे टेबल व्यू को रीफ्रेश करने में समस्याएं आ रही हैं। मैंने कोड और घटनाओं के विभिन्न संयोजनों की कोशिश की है और अब ऐप एंड अपडेट कॉल पर क्रैश हो रहा है। ऐप को रेसिपी ऐप के बाद मॉडलिंग किया जाता है, इसलिए कोई उपयोगकर्ता ऐड बटन पर क्लिक करता है, और फिर एक मोडल विंडो उपयोगकर्ता नाम के लिए पूछता है। फिर यह संपादन स्क्रीन पर जाता है, और फिर उपयोगकर्ताओं की सूची में वापस जाता है। उस बिंदु पर, नया उपयोगकर्ता प्रदर्शित नहीं हो रहा था। लेकिन अगर मैं मुख्य स्क्रीन पर वापस जा रहा हूं, और फिर उपयोगकर्ता स्क्रीन पर वापस आ गया, तो उपयोगकर्ता दिखाई देगा।आईफोन ऐप क्रैशिंग [self.tableView endUpdates]

यहाँ मेरी कोड के कुछ है:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    sectionInsertCount = 0; 
    [self.tableView beginUpdates]; 
} 
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 

} 

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

    case NSFetchedResultsChangeInsert: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount++; 
      } 

    break; 
    case NSFetchedResultsChangeDelete: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount--; 
      } 

    break; 
     case NSFetchedResultsChangeMove: 
      break; 
     case NSFetchedResultsChangeUpdate: 
      break; 
     default: 
      break; 
} 
} 

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
switch(type) { 
    case NSFetchedResultsChangeInsert: 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
    case NSFetchedResultsChangeDelete: 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
     case NSFetchedResultsChangeUpdate: { 
      [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
    case NSFetchedResultsChangeMove: 
      if (newIndexPath != nil) { 

       NSUInteger tableSectionCount = [self.tableView numberOfSections]; 
       NSUInteger frcSectionCount = [[controller sections] count]; 
       if (frcSectionCount != tableSectionCount + sectionInsertCount) { 
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone]; 
        sectionInsertCount++; 
       } 


       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath] 
            withRowAnimation: UITableViewRowAnimationRight]; 

    runEndUpdates = NO; 

      } 
      else { 
       [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
      } 
    break; 
     default: 
    break; 
} 
} 

मैं इस के साथ एक को तोड़ने बिंदु पर लगभग हूँ। कोरडाटा ऐप विकास का सबसे निराशाजनक हिस्सा रहा है। क्या मुझे बस एसक्यूएल लाइट पर स्विच करना चाहिए? या फिर भी मुझे एक ही समस्या होगी?

धन्यवाद!

उत्तर

2

आज मेरे पास एक ही समस्या थी।

समस्या मेरी स्रोत कोड में था - UITableViewDataSource कार्यों अमान्य ऑब्जेक्ट का इस्तेमाल किया (नहीं CoreData वस्तु, सरल सरणी है, जो मैं बनाए रखने के लिए भूल गया) में से एक है, इस दुर्घटना का कारण बना। दुर्भाग्यवश यह कॉल स्टैक से स्पष्ट नहीं था, कंसोल में कोई संदेश प्रदान नहीं किया गया था।

तो कारण UITableViewDataSource प्रोटोकॉल के अपने कार्यान्वयन में हो सकता है।

+0

लेकिन यदि आप fetchedResultsController (लेखक की तरह) का उपयोग करते हैं - यहां गलती करना बहुत मुश्किल है :) अनुभागों की संख्या: वापसी [self.fetchedResultsController.sections count]; पंक्तियों की संख्याइनसेक्शन: वापसी [self.fetchedResultsController.sections [अनुभाग] संख्याऑफ ऑब्जेक्ट्स]; – Miroslav

-3

controllerDidChangeContent अंदर [self.tableview reloaddata] कॉल करने के लिए प्रयास करें।

+6

जो पंक्ति परिवर्तनों को एनिमेट करने के पूरे उद्देश्य को मारता है। – samvermette

+0

"आपको समूह के भीतर पुनः लोडडेटा नहीं कहना चाहिए; यदि आप समूह के भीतर इस विधि को कॉल करते हैं, तो आपको स्वयं को कोई एनीमेशन करने की आवश्यकता होगी।" - ऐप्पल दस्तावेज़ीकरण से: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/begin अद्यतन – Fabio

5

मेरे अनुभव में, यह कुछ पंक्तियाँ या वर्गों डाला जाता है या beginUpdated और endUpdated के बीच हटाए होना आवश्यक है। यदि startUpdated और endUpdated के बीच कोई भी पंक्तियां या अनुभाग डाला या हटाया गया है, तो यह क्रैश हो जाएगा।

और, यदि खंड संख्या और पंक्ति संख्या सही नहीं हैं, यह भी दुर्घटना होगा। तो, इसे बहुत सावधानी से कोडिंग की आवश्यकता है।

+0

यह समस्या ठीक हुई I था। मैं UISearchBar और NSFetchedResultsController के साथ पंक्तियों को फ़िल्टर कर रहा था। उपयोगकर्ता didSelectRowAtIndexPath में एक सहेजने वाली घटना को ट्रिगर करने वाली पंक्ति का चयन करेगा। ध्वज बनाना और NO पर सेटिंग करना, UITableView प्रारंभ करना बंद कर देता है और एंडअपडेट्स को समस्या को हल और हल किया जा रहा है। धन्यवाद टोरो – RobCroll

2

मैं एक ही स्थान पर एक दुर्घटना देख रहा था, लेकिन एक अलग कारण के लिए। मैं यह अजीब व्यवहार भी देखूंगा जहां टेबल व्यू स्क्रॉलिंग क्रॉल में धीमी हो जाएगी, और मूल रूप से अनुत्तरदायी बन जाएगी। इसके पीछे कारण साफ और दिलचस्प प्रकार का रहा, इसलिए मुझे लगा कि मैं इसे साझा करूंगा।

मेरी तालिका दृश्य में तिथि के अनुसार क्रमबद्ध घटनाओं का एक समूह है। घटनाओं को एक समय में एक वेब एपीआई 50 ​​से पूछताछ की जाती है। प्रत्येक बार जब कोई नई क्वेरी बनाई जाती है, तो प्राप्त परिणाम अपडेट और नई कोशिकाएं एनिमेटेड हो जाती हैं। शुरुआती दिनों में जब मैंने नई पंक्तियां जोड़ दीं तो बहुत अजीब स्थानांतरण हुआ, लेकिन यह बाद में अनुकूलित करने के लिए कुछ ऐसा लग रहा था। अनुप्रयोग में

घटनाक्रम बचाया जा सकता है और तालिका दृश्य सभी घटनाओं और बचाया घटनाओं के बीच फिल्टर करने के लिए एक तरीका है। एक बार जब मैं सभी घटनाओं और सहेजी गई घटनाओं के बीच आगे और पीछे स्विच करने के लिए फ़िल्टर को टैप कर रहा था, और मैंने देखा कि किसी विशेष दिन के भीतर जब मैंने सभी घटनाओं पर वापस स्विच किया तो उन्हें पुन: व्यवस्थित किया जाएगा।

ओह ओह, मैं भी शुरू करने का समय की जानकारी देता जरूरत है। यह ऐसा कुछ है जो ऐप को अच्छे इस्तेमाल करने के लिए तैयार करेगा।

ओएच डुह! मैं शर्त लगाता हूं यही कारण है कि यह भी दुर्घटनाग्रस्त हो रहा है! चूंकि प्रत्येक अपडेट मूल रूप से प्रत्येक मौजूदा पंक्ति को नए स्थान पर ले जाने के कारण होता है, साथ ही अतिरिक्त पंक्तियां जोड़ना, मुझे टेबल व्यू कंट्रोलर में कुछ क्रैश बग मारना होगा। अब स्क्रॉलिंग समस्याएं चली गई हैं, और दुर्घटना भी चली गई है।

सबक सीखा: सुनिश्चित करें कि आपके fetched परिणाम नियंत्रक के पास दृश्य के पुनः लोड पर निर्धारक होने के लिए पर्याप्त प्रकार के वर्णनकर्ता हैं।

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