इसमें विफलता - [UITableView _endCellAnimationsWithContext:]


89

उम्मीद है कि यह जल्दी ठीक हो जाएगा। मैं उस त्रुटि का पता लगाने की कोशिश कर रहा हूं जो मुझे मिलती रहती है। त्रुटि नीचे सूचीबद्ध है और appdelagate नीचे है।

किसी भी मदद की सराहना की है।

धन्यवाद

2012-04-12 21: 11: 52.669 चंदा [75100: f803] --- 2012 में शोध विफलता -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21: 11: 52.671 चंदा [75100: f803] --- बिना किसी अपवाद के समाप्त होने वाला ऐप ' NSInternalInconsistencyException' , कारण: 'अमान्य अद्यतन: खंड में पंक्तियों की अमान्य संख्या 0. अद्यतन के बाद एक मौजूदा खंड में शामिल पंक्तियों की संख्या (2) अद्यतन से पहले उस खंड में शामिल पंक्तियों की संख्या के बराबर होनी चाहिए (2), प्लस या उस खंड से डाली गई या हटाई गई पंक्तियों की संख्या (1 सम्मिलित, 0 हटाई गई) और प्लस या उस खंड से बाहर निकाली गई पंक्तियों की संख्या माइनस (0 में ले जाया गया, 0 बाहर ले जाया गया)। '

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize databaseName,databasePath; 

- (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
    self.databaseName = @"Customers.db";

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [documentPaths objectAtIndex:0];
    self.databasePath = [documentDir stringByAppendingPathComponent:self.databaseName];
    [self createAndCheckDatabase];

    return YES;
}

- (void)createAndCheckDatabase {
    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:databasePath];

    if (success) return; 

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName];

    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}

@end

3
आपको उस कोड को कक्षाओं में ले जाना चाहिए और संभवतः इसे एक पृष्ठभूमि थ्रेड में निष्पादित करना चाहिए। वैसे भी, यह त्रुटि आमतौर पर तब उत्पन्न होती है जब आप वास्तव में तालिका दृश्य डेटा स्रोत द्वारा प्रदान की गई पंक्तियों की संख्या को कम किए बिना पंक्तियों को हटाने का प्रयास करते हैं। जब आप पंक्तियों को हटाते हैं तो क्या आप वास्तव में डेटा निकाल रहे हैं? यदि आप किसी भी पंक्तियों को नहीं हटा रहे हैं, तो क्या आप अपनी तालिका दृश्य डेटा स्रोत कार्यान्वयन प्रदान कर सकते हैं?
कांस्टेंटिनो त्सारोहास

जवाबों:


43

मुझे आपको इस कोड का हिस्सा दिखाने के लिए कारण नहीं दिख रहा है। आपकी त्रुटि इस भाग से जुड़ी होनी चाहिए जिसे मैं मानता हूं

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

संभवतः आप इन डेटा स्रोत विधियों में से एक में गलती कर रहे हैं। वर्तमान में यह कहना असंभव है कि वास्तव में क्या गलत है, लेकिन मुझे लगता है कि यह कुछ इस तरह हो सकता है: आप तालिका में बता रहे हैं कि numberOfRowsInSectionआप n पंक्तियों को आरक्षित और सेटअप करना चाहते हैं और cellForRowAtIndexPathआप में केवल n - 1 पंक्तियों को उदाहरण के लिए संभालना है ।

क्षमा करें कि यह उत्तर उतना सटीक नहीं हो सकता है जितना होना चाहिए। यदि आप हमें अपने डेटा स्रोत का कार्यान्वयन दिखाते हैं, तो यह बताना बहुत आसान होगा कि क्या हो रहा है।


26

जैसे सूर्य त्ज़ु ने कहा : बिना लड़े जीतना सबसे अच्छा है । मेरे मामले में जब भी मैं इस तरह का त्रुटि संदेश देखता हूं (अर्थात हटाए गए पंक्तियों के बीच विसंगति) आदि .. मैं कुछ भी डीबग नहीं करता हूं .. मैं बस उस अतिरिक्त कॉल को करने से बचता हूं जहां मैं पंक्तियों को लोड करता हूं आदि .. जो कि 99% है जिन मामलों में यह त्रुटि होती है।

यह एक सामान्य परिदृश्य है जहां यह बग होता है: मेरे पास एक है UINavigationControllerऔर यह एक है UITableView, जब मैं एक पंक्ति पर क्लिक करता हूं तो यह एक नया UITableViewऔर इतने पर धक्का देता है । यह त्रुटि हमेशा मेरे साथ होती है जब मैं आखिरी पॉप करता हूं UITableviewऔर इसके पहले वापस UITableViewजाता हूं, इस बिंदु पर मैं loadItफ़ंक्शन को एक अनावश्यक कॉल करता हूं जो मूल रूप से पंक्तियों को सम्मिलित करता है और फिर से लोड करता है UITableView

क्योंकि मैं ग़लती से मेरी loadIt समारोह जगह कारण ऐसा होता है है viewDidAppear:animatedके बजाय viewDidLoadviewDidAppear:animatedहर बार UITableViewप्रदर्शित होने पर, viewDidLoadकेवल एक बार कहा जाता है।


3
धन्यवाद, अच्छा कहा। आपके पहले पैराग्राफ ने मुझे इसी तरह की समस्या को हल करने के लिए सही रास्ते पर डाल दिया।
बदनाम करना

2
यह मेरी खुशी की बात है @scrrr :)
abbood

इस तरह से मैंने इसे देखा - इसे अप्रासंगिक बनाकर समस्या को ठीक किया। आपने धमाल मचाया!
चार्ली

देखने के लिए देखने के बजाय कुदोस। यह वास्तव में मेरा मुद्दा था और मैं इसके साथ हफ्तों से काम कर रहा था।
ग्रैंडस्टेप

1
मैंने आपकी सन त्ज़ु बोली को मुद्रित किया और इसे मेरी स्क्रीन के शीर्ष पर टैप किया। उद्धरण के लिए धन्यवाद और निरर्थक कोड का एक टन खोजने में मुझे सहायता :) :)
एड्रियन

24

पंक्तियों को हटाते समय, याद रखें कि यह अपडेट करते समय अनुभागों की भी जाँच करता है:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

यदि आप ऐसी पंक्ति को हटाना चाहते हैं जो किसी खंड में अंतिम आइटम है, तो आपको इसके बजाय पूरे अनुभाग को निकालने की आवश्यकता है (अन्यथा यह अनुभाग गलत हो सकता है और इस अपवाद को फेंक सकता है)।


1
यह ठोस सोना है! सिर पर कील ठोक दी! बिल्कुल मेरा मुद्दा।
फतमान

6

अपने सरणी को अद्यतन करने के लिए मत भूलना जो नंबरऑफ़रोज़इन को निर्धारित करता है। आपको चेतन करने और हटाने से पहले इसे अपडेट करना होगा

हम जाँचते हैं कि क्या अनुभाग में पंक्तियों की संख्या 1 है क्योंकि हमें पूरे खंड को हटाना होगा।

अगर कोई इस जवाब को स्पष्ट कर सकता है तो मुझे सही करें।

[self.tableView beginUpdates];
if ([tableView numberOfRowsInSection:indexPath.section] == 1) {

   [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
} else {

   [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
[self.tableView endUpdates];

4

मैंने प्रत्येक अनुभाग तत्वों को अलग-अलग सरणियों में रखा। फिर उन्हें दूसरे सरणी (arrayWithArray) में डालें। इस समस्या के लिए यहाँ मेरा समाधान:

[quarantineMessages removeObject : message];
[_tableView beginUpdates];
if([[arrayWithArray objectAtIndex: indPath.section] count]  > 1)
{
    [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indPath] withRowAnimation:UITableViewRowAnimationBottom];
}
else
{
    [_tableView deleteSections:[NSIndexSet indexSetWithIndex:indPath.section]
              withRowAnimation:UITableViewRowAnimationFade];
}
[_tableView endUpdates];

1
मेरे लिए यह शुरुआती और अंतिम अपडेट था जिसने इसे हल किया, धन्यवाद!
मार्क डब्ल्यू

2
मुझे नहीं पता था कि इस खंड के खाली होने और इसके बजाय इसे चेतन करने की आवश्यकता के बारे में ... लानत है! धन्यवाद!
डीवीच

1
इस उत्तर से बहुत मदद करने के लिए मेरा कोड मिला। इसे नीचे पोस्ट कर रहा हूँ।
love2script12

2

मेरी भी यही त्रुटि थी।

मैं निम्नलिखित पंक्तियों का उपयोग कर रहा था

UINib *myCustomCellNib = [UINib nibWithNibName:@"CustomNib" bundle:nil];
[tableView registerNib:myCustomCellNib forCellReuseIdentifier:@"CustomNib"];

दृश्य में विधि दर्ज करने के लिएडायलाड विधि, क्योंकि मेरे पास एक अलग नायब था जो एक ही वर्ग के साथ भी जुड़ा हुआ था। इसलिए, लाइन

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GBFBLoadingCell"];

जब तक मैं दृश्य में निड पंजीकृत नहीं करता तब तक शून्य लौट रहा था।

मेरी समस्या यह थी कि मैं अपनी फ़ाइल "CustomNib.xib" और "CustomNib ~ iphone.xib" के लिए गुण निरीक्षक में पहचानकर्ता सेट करना भूल गया। (या अधिक सटीक रूप से, कि मैं XCode में विशेषता निरीक्षक में पहचानकर्ता टाइप करने के बाद एंटर दबाना भूल गया, ताकि नया नाम सहेजने में विफल रहे।)

उम्मीद है की यह मदद करेगा।


2
मुझे नहीं लगता कि आपके जवाब का इस मुद्दे से कोई संबंध है।
डॉनसॉन्ग

2

यदि आप NSFetchedResultsControllerमेरे जैसा उपयोग कर रहे हैं और बैकग्राउंड थ्रेड में डेटा अपडेट कर रहे हैं , तो प्रतिनिधि में अपडेट शुरू और समाप्त करना न भूलें:

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

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

2

मेरे पास वही त्रुटि थी, जो कोशिश करते [tableView reloadData]समय ठीक थी। त्रुटि वास्तव में लाइन में थी

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

जब मैंने indexPath मानों की जांच करने की कोशिश की, तो वे आवश्यकतानुसार सही नहीं थे।

में मूल्यों को बदलकर मैंने इसे ठीक किया indexPathsArray

उम्मीद है की यह मदद करेगा ।


1

यह UITableViewDataSourceप्रोटोकॉल विधियों में से एक हो सकता है

के लिये

- tableView:numberOfRowsInSection:

यह योग या परिणाम के बराबर एक पूर्णांक वापस करना चाहिए

-insertRowsAtIndexPaths:withRowAnimation:और / या -deleteRowsAtIndexPaths:withRowAnimation:

के लिये

- numberOfSectionsInTableView:

यह योग या परिणाम के बराबर एक पूर्णांक वापस करना चाहिए

-insertRowsAtIndexPaths:withRowAnimation: और / या -deleteSections:withRowAnimation:


0

मुझे कोर डेटा बेस के साथ भी यही समस्या थी। यदि आपका कई FRC उपयोग कर रहा है, तो आपको बस नंबर की प्रत्येक स्थिति के अंदर tableO को पुनः लोड करने की आवश्यकता है।


2
मैं भी कोर डेटा के साथ इस मुद्दे को है। क्या आप कृपया अपनी रेसिपी पर विस्तार से बता सकते हैं।
ड्रक्स

0

जानकारी के प्रबंधन के लिए स्विफ्ट और एफआरसी समर्थित डेटा स्टोर का उपयोग करते समय मेरे साथ बस यही हुआ था। हटाए गए ऑपरेशन के लिए एक सरल जांच को जोड़कर वर्तमान indexPath.section का मूल्यांकन करने के लिए मुझे एक बाहरी कॉल से बचने की अनुमति दी। मुझे लगता है कि मैं समझता हूं कि यह समस्या क्यों होती है ... मूल रूप से जब भी मेरा डेटासेट खाली होता है, तो मैं शीर्ष पंक्ति में एक संदेश लोड करता हूं। यह एक समस्या द्वारा एक बंद बनाता है क्योंकि एक अशुद्ध पंक्ति है।

मेरा समाधान

... delete my entity, save the datastore and call reloadData on tableView
//next I add this simple check to avoid calling deleteRows when the system (wrongly) determines that there is no section.

       if indexPath.section > 0 {

        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .None)

            }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.