2011-06-22 10 views
26

मेरे पास एक कस्टमटेबल व्यू सेल है - मैं बस सेल पर अपडेट करना चाहता हूं (नेटवर्क घटना के आधार पर)।आईओएस UITableView "सेल के लिए दो एनिमेशन बनाने का प्रयास"

तो जब मैं पहली नेटवर्क कॉल कर मुझे क्या करना:

- (void)makeNetworkCall 
{ 

     [self.tableView beginUpdates]; 

     // MAKE_NETWORK_CALL 

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 


     [self.tableView endUpdates]; // SIGABRT OCCURS HERE ON SECOND CALL 
} 

- (void)networkDataReturned:(NSDictionary*)dataReturned 
{ 
    // UPDATE_TABLE_VIEW_DATA_MODEL  

    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 

    } 

यह पूरी तरह से पहली बार नेटवर्क घटना कहा जाता है काम करता है, लेकिन यदि सेल उपयोग किया जाता है (इस प्रकार फिर से नेटवर्क घटना बुला, परिणाम जिनमें से अब कैश किए गए) मैं निम्नलिखित त्रुटि मिलती है:

2011-06-22 11:19:11.262 App[3991:707] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForExistingVisibleCells], /SourceCache/UIKit/UIKit-1448.89/UITableViewSupport.m:288 
2011-06-22 11:19:11.327 App[3991:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x32c7664f __exceptionPreprocess + 114 
    1 libobjc.A.dylib      0x36eb9c5d objc_exception_throw + 24 
    2 CoreFoundation      0x32c76491 +[NSException raise:format:arguments:] + 68 
    3 Foundation       0x32894573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62 
    4 UIKit        0x35f59d3b -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 402 
    5 UIKit        0x35f58b81 -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 296 
    6 UIKit        0x35f57dc1 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 972 
    7 UIKit        0x35f57473 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 4750 
    8 UIKit        0x35f612f9 -[UITableView endUpdatesWithContext:] + 28 
    9 UIKit        0x35f612d5 -[UITableView endUpdates] + 16 
    10 App        0x0005a033 -[CustomTableViewController tableView:didSelectRowAtIndexPath:] + 574 

उत्तर

2

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

+0

से उत्तर की एक विशिष्ट स्थिति है, नीचे @jjramos उत्तर देखें। ऐसा लगता है कि यह शायद कम अशुभ कम गड़बड़ी की स्थिति है। – clearlight

2

मान लें self.arTableData तालिका & tableView का एक म्यूटेबल सरणी UITableView का एक उदाहरण है। मान लें कि tableView में 10 पंक्तियां हैं (जिसका अर्थ है सरणी में 10 ऑब्जेक्ट्स)। मैं एनिमेटेड पंक्तियों को हटाने के लिए निम्नलिखित कोड लागू करता हूं।

int i; // to remove from 3 to 6 
for(i=2;i<6;i++) 
{ 
    [self.arTableData removeObjectAtIndex:i]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight]; 
} 

आप एक से अधिक पंक्ति विलोपन चाहते हैं, एक & सब नहीं एक ही बार में पंक्तियों एक दूर करने की कोशिश। एकाधिक पंक्तियों (एनीमेशन समेत) को हटाने से दुर्घटना हो सकती है।

लेकिन जब आप पंक्तियां डाल रहे हों, तो आप & डालने के लिए संपूर्ण सरणी पास कर सकते हैं UITableView निश्चित रूप से एनीमेशन निष्पादित करेगा।

यह चाल बिना किसी परेशानी के मेरे लिए काम करती है। उम्मीद है कि यह आपके लिए भी काम करेगा। शुभकामनाएँ।

+1

मेरे लिए काम किया, धन्यवाद! –

+0

@ स्पार्क अगर आप लूप और [self.arTableData endUpdates] से पहले [self.arTableData startUpdates] जोड़ते हैं, तो यह सभी डिलीट ऑपरेशंस को एक ही एनीमेशन में बैच करेगा – imnk

54

किसी भी व्यक्ति को जो इस स्थिति को फिर से सामना करता है, सुनिश्चित करें कि सरणी में पुन: लोड, हटाएं या डालने के लिए सरणी में दोहराए गए इंडेक्सपैथ नहीं हैं RowAtIndexPaths।

+0

बिल्कुल सही, धन्यवाद! –

+0

महान जवाब! मुझे अपेक्षाकृत स्पष्ट याद आ रही है, जबकि टेंगेंट की जांच में बहुत बर्बाद समय बचाया। आईएमओ, ऐप्पल को आपके संकेत को शामिल करने के लिए त्रुटि संदेश पाठ में सुधार करना चाहिए। – clearlight

+0

मेरे पास दोहराए गए पथ नहीं थे लेकिन खंडों के लिए गलत संख्याएं (एक बग ने अनुभाग को '(NSUInteger) -1' के रूप में सेट किया था)। वैसे भी, आपके जवाब ने मुझे समाधान के लिए इंगित किया, धन्यवाद। –

0

मुझे यह खंड में इंडेक्स -1 के साथ पंक्ति को हटाने की कोशिश करने के लिए मिला।

0

मेरे मामले में, मेरे पास उपयोगकर्ता के वर्तमान स्थान की दूरी के साथ रेस्तरां का एक टेबल व्यू है। जब यह नया उपयोगकर्ता स्थान प्राप्त करता है तो दूरी अपडेट की जाएगी। यह कुछ क्षणों पर कोशिकाओं को अद्यतन करने का कारण बनता है। यदि उपयोगकर्ता पुन: ऑर्डर करते हैं तो कोशिकाएं एक ही समय में होती हैं जैसे कि कोशिकाओं को अद्यतन किया जा रहा है। एक सेल दो पदों से छेड़छाड़ की जाएगी। इसने प्रोग्राम को दुर्घटनाग्रस्त कर दिया। इसलिए मैं सिर्फ यह जांचता हूं कि यह संपादन मोड है, दूरी को अपडेट न करें। मुझे उम्मीद है कि यह मदद कर सकता है। यह @jjramos

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