দৃ failure়তা ব্যর্থতা - [UITableView _endCellAnimationsWithContext:]


89

আশা করি এটি দ্রুত সমাধান হবে। আমি যে ত্রুটিটি পেতে চলেছি তা সনাক্ত করার চেষ্টা করছি। ত্রুটিটি নীচে তালিকাভুক্ত করা হয়েছে এবং অ্যাপিডিলেটটি তার নীচে রয়েছে।

কোন সাহায্য প্রশংসা করা হয়।

ধন্যবাদ

2012-04-12 21: 11: 52.669 চান্দা [75100: f803] --- দৃ failure় ব্যর্থতা -[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 মুছে ফেলা হয়েছে) এবং প্লাস বা বিয়োগ সারণীর সংখ্যা that বিভাগে বা বাইরে সরানো হয়েছে (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

4
আপনার সেই কোডটি ক্লাসে স্থানান্তরিত করা উচিত এবং সম্ভবত এটি একটি পটভূমির থ্রেডে চালিত করা উচিত। যাইহোক, এই ত্রুটিটি সাধারণত উত্থাপিত হয় যখন আপনি টেবিল দর্শনের ডেটা উত্স দ্বারা সরবরাহিত সারিগুলির সংখ্যা হ্রাস না করেই সারিগুলি সরানোর চেষ্টা করেন। আপনি যখন সারিগুলি সরাবেন তখন আপনি কি আসলে ডেটা অপসারণ করছেন? আপনি যদি কোনও সারি মুছে ফেলছেন না, আপনি কি আপনার টেবিলের ভিউ ডেটা উত্স বাস্তবায়ন সরবরাহ করতে পারেন?
কনস্টান্টিনো জারোহাস

উত্তর:


43

আপনি কোডের এই অংশটি দেখানোর কারণ আমি দেখছি না। আপনার ত্রুটিটি অবশ্যই আপনার কোডটি আমি অনুমান করি এই অংশের সাথে সংযুক্ত থাকতে হবে

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

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

সম্ভবত আপনি এই ডেটা উত্স পদ্ধতিতে একটিতে ভুল করছেন। বর্তমানে ঠিক কী ভুল তা বলা অসম্ভব তবে আমি ধরে নিলাম এটি এমন কিছু হতে পারে: আপনি আপনার টেবিলের দৃশ্যে বলছেন যে numberOfRowsInSectionআপনি এন সারিগুলি সংরক্ষণ এবং সেটআপ রাখতে চান এবং cellForRowAtIndexPathকেবলমাত্র উদাহরণস্বরূপ কেবল n - 1 সারিগুলি পরিচালনা করবেন।

দুঃখিত যে এই উত্তরটি ঠিক মতো হওয়া উচিত নয় can't আপনি যদি আমাদের আপনার ডেটা উত্সটি প্রয়োগ করে দেখান তবে কী চলছে তা বলা সহজ।


26

যেমন সান তজু বলেছেন : লড়াই না করেই জিতাই ভাল । আমার ক্ষেত্রে যখনই আমি এই ধরণের ত্রুটি বার্তাটি দেখি (যেমন সারিগুলির মধ্যে বিচ্ছিন্নতা মুছে ফেলা ইত্যাদি রয়েছে) .. আমি কোনও ডিবাগও করি না .. আমি কেবল অতিরিক্ত কল করা এড়াতে যেখানে আমি সারিগুলি পুনরায় লোড করি ইত্যাদি .. যা 99% এর যে ক্ষেত্রে এই ত্রুটিটি ঘটে।

এটি একটি সাধারণ পরিস্থিতি যেখানে এই ত্রুটিটি ঘটে: আমার একটি রয়েছে UINavigationControllerএবং এটিতে একটি রয়েছে UITableView, যখন আমি একটি সারিটিতে ক্লিক করি তখন এটি একটি নতুন UITableViewএবং আরও কিছুটা ধাক্কা দেয় । এই ত্রুটিটি আমার সবসময় হয় যখন আমি গত পপ UITableviewএবং ফিরে যেতে UITableViewএটা আগে, এই সময়ে আমি একটি অপ্রয়োজনীয় কল করতে loadItফাংশন যা মূলত সারি সন্নিবেশ এবং relaods UITableView

এটি হওয়ার কারণটি হ'ল আমি ভুল করে আমার লোডইটি ফাংশনের viewDidAppear:animatedপরিবর্তে রাখি viewDidLoad। প্রদর্শিত হয় viewDidAppear:animatedপ্রতিবার বলা UITableViewহয়, viewDidLoadশুধুমাত্র একবার বলা হয়।


4
ধন্যবাদ, ভাল বলেছেন। আপনার প্রথম অনুচ্ছেদে অনুরূপ সমস্যা সমাধানের জন্য আমাকে সঠিক ট্র্যাকে রেখেছিল।
scrrr

4
এটি আমার সন্তুষ্টি @ এসএসআরআর :)
অ্যাবুড

আমি এটি যেভাবে দেখেছি তার পরিবর্তিত করে - এটি এটিকে অপ্রাসঙ্গিক করে সমস্যার সমাধান করেছে। তুমি রক!
চার্লি

ভিউডিডঅডের চেয়ে ভিডিডিঅ্যাপারে খেলুন। এটি হ'ল আমার সমস্যা এবং আমি কয়েক সপ্তাহ ধরে এটি মোকাবেলা করছি।
গ্র্যান্ডস্টেফ

4
আমি আপনার সানজু উদ্ধৃতিটি মুদ্রণ করে এটিকে আমার স্ক্রিনের শীর্ষে ট্যাপ করেছি। একটি টন রিলান্ডান্ট কোড সন্ধানে উদ্ধৃতিটি এবং আমাকে সহায়তা করার জন্য আপনাকে ধন্যবাদ :)
অ্যাড্রিয়ান

24

সারিগুলি সরানোর সময়, মনে রাখবেন যে এটি আপডেট করার সময় বিভাগগুলিও পরীক্ষা করে:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

আপনি যদি কোনও বিভাগের শেষ আইটেম এমন একটি সারি সরিয়ে ফেলতে চান তবে তার পরিবর্তে আপনাকে পুরো বিভাগটি সরিয়ে ফেলতে হবে (অন্যথায় এটি বিভাগটি ভুল হিসাবে গণ্য হতে পারে এবং এই ব্যতিক্রমটি ফেলে দিতে পারে)।


4
এই শক্ত সোনার! মাথায় পেরেক আঘাত! ঠিক আমার সমস্যা।
ফ্যাটম্যান

6

আপনার অ্যারে আপডেট করতে ভুলবেন না যা নম্বরঅফ্রাউজইনসেকশন নির্ধারণ করে। আপনি অ্যানিমেটেড এবং সরানোর আগে এটি আপডেট করা দরকার

বিভাগে সারিগুলির সংখ্যা 1 হয় কিনা তা আমরা পরীক্ষা করি কারণ আমাদের পুরো বিভাগটি মুছতে হবে।

যদি কেউ এই উত্তর পরিষ্কার করে দিতে পারে তবে আমাকে সংশোধন করুন Do

[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

আমি প্রতিটি বিভাগের উপাদানগুলি পৃথক অ্যারেগুলিতে রেখেছি। তারপরে এগুলিকে অন্য অ্যারে (অ্যারে উইথআররে) এ দিন। এই সমস্যার জন্য আমার সমাধান এখানে:

[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];

4
আমার জন্য এটি শুরু এবং শেষ আপডেট যা এটি সমাধান করেছিল, ধন্যবাদ!
ডাব্লু

4
আমি জানতাম না যে বিভাগটি খালি হয়ে যাচ্ছে এবং এর পরিবর্তে এটি সঞ্চারিত করা দরকার ... জঘন্য! ধন্যবাদ!
dvkch

4
এই উত্তর থেকে প্রচুর সহায়তা নিয়ে আমার কোডটি পেয়েছেন। এটি নীচে পোস্ট করা।
love2script12

2

আমারও ত্রুটি ছিল

আমি নিম্নলিখিত লাইন ব্যবহার করছিলাম

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

নিবিডটি ভিউডিডলড পদ্ধতিতে নিবন্ধভুক্ত করার জন্য, যেহেতু আমার একটি পৃথক নিব ছিল যা একই শ্রেণীর সাথেও যুক্ত ছিল। সুতরাং, লাইন

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

আমি নিলিড ভিডে নিবটি নিবন্ধিত না করে শূন্য ফিরছিলাম।

আমার সমস্যাটি হ'ল আমি আমার ফাইল "কাস্টমনিব.এসআইবিবি" এবং "কাস্টমনিব ip iphone.xib" ফাইলের জন্য বৈশিষ্ট্য পরিদর্শকের মধ্যে সনাক্তকারী সেট করতে ভুলে গেছি। (বা আরও স্পষ্টভাবে, আমি এক্সকোডে অ্যাট্রিবিউট ইন্সপেক্টরটিতে সনাক্তকারী টাইপ করার পরে এন্টার টিপতে ভুলে গিয়েছিলাম, যাতে নতুন নামটি সংরক্ষণ করতে ব্যর্থ হয় save)

আশাকরি এটা সাহায্য করবে.


4
আমি মনে করি না যে এই উত্তরটির সাথে আপনার উত্তরটির সম্পর্ক আছে।
ডনসং

2

আপনি যদি NSFetchedResultsControllerআমার মতো ব্যবহার করেন এবং পটভূমির থ্রেডে ডেটা আপডেট করেন তবে প্রতিনিধিটির আপডেট আপডেট এবং শেষ করতে ভুলবেন না:

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

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

2

আমারও একই ত্রুটি ছিল, যা চেষ্টা করার [tableView reloadData]সময় ভাল কাজ করছিল। ত্রুটিটি আসলে লাইনে ছিল

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

আমি যখন সূচকপথের মানগুলি পরীক্ষা করার চেষ্টা করেছি তখন সেগুলি প্রয়োজনীয় হিসাবে সঠিক ছিল না।

আমি মানগুলি পরিবর্তন করে এটি ঠিক করেছি indexPathsArray

আশাকরি এটা সাহায্য করবে .


1

এটি UITableViewDataSourceপ্রোটোকল পদ্ধতিগুলির মধ্যে একটি হতে পারে

জন্য

- tableView:numberOfRowsInSection:

এর যোগফল বা এর ফলাফলের সমান একটি পূর্ণসংখ্যা ফেরত দেওয়া উচিত

-insertRowsAtIndexPaths:withRowAnimation:এবং / অথবা -deleteRowsAtIndexPaths:withRowAnimation:

জন্য

- numberOfSectionsInTableView:

এর যোগফল বা এর ফলাফলের সমান একটি পূর্ণসংখ্যা ফেরত দেওয়া উচিত

-insertRowsAtIndexPaths:withRowAnimation: এবং / অথবা -deleteSections:withRowAnimation:


0

একটি কোর ডেটা বেস নিয়ে আমারও একই সমস্যা ছিল। যদি আপনি অনেকগুলি এফআরসি ব্যবহার করে থাকেন তবে আপনাকে কেবলমাত্র অফসেকশনসইনট্যাবলভিউতে প্রতিটি শর্তের মধ্যে সারণীদর্শনটি পুনরায় লোড করতে হবে।


4
কোর ডেটা সহ আমারও এই সমস্যা রয়েছে। আপনি কি দয়া করে আপনার রেসিপিটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
ড্রুক্স

0

তথ্য পরিচালনা করতে সুইফট এবং একটি এফআরসি ব্যাকড ডেটা স্টোর ব্যবহার করার সময় আমার সাথে এই ঘটনাটি ঘটেছিল। বর্তমান সূচকপথ মূল্যায়নের জন্য মুছুন অপারেশনে একটি সাধারণ চেক যোগ করা আমাকে একটি বহিরাগত কল এড়ানোর অনুমতি দেয়। আমি মনে করি আমি বুঝতে পারি কেন এই সমস্যা দেখা দেয় ... মূলত আমি যখনই আমার ডেটাসেট খালি থাকি তখন উপরের সারিতে একটি বার্তা লোড করি। একটি ছদ্ম সারি থাকায় এটি একটি ইস্যু দ্বারা বন্ধ করে দেয়।

আমার সমাধান

... 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)

            }

0

কেবলমাত্র যাচাই করে দেখুন যে আপনি [আপনার টেবিলভিউ রিলোডডাটা] কল করেছেন; মানগুলির অ্যারে সংশোধন করার পরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.