Надеюсь, это быстро исправит. Я пытаюсь выяснить, в чем заключается ошибка, которую я получаю. Ошибка указана ниже, а приложение - ниже.
Любая помощь приветствуется.
Благодарность
2012-04-12 21: 11: 52.669 Chanda [75100: f803] --- Ошибка утверждения в
-[UITableView _endCellAnimationsWithContext:]
,/SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037
2012-04-12 21: 11: 52.671 Chanda [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
источник
Ответы:
Я не вижу смысла показывать нам эту часть кода. Ваша ошибка должна быть связана с этой частью вашего кода, я полагаю
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
Возможно, вы ошиблись в одном из этих методов источника данных. В настоящее время невозможно сказать, что именно не так, но я предполагаю, что это может быть что-то вроде: вы указываете представление таблицы в том, что
numberOfRowsInSection
вы хотите, чтобы n строк были зарезервированы и настроены, а в этом случаеcellForRowAtIndexPath
вы обрабатываете только n - 1 строку, например.Извините, что этот ответ не может быть таким точным, каким должен быть. Если вы покажете нам свою реализацию источника данных, будет намного проще понять, что происходит.
источник
Как сказал Сунь-Цзы : лучше побеждать без борьбы . В моем случае всякий раз, когда я вижу такое сообщение об ошибке (например, несоответствие между добавленными строками, удаленными и т. Д.). Я даже ничего не отлаживаю. Я просто избегаю этого дополнительного вызова, когда я перезагружаю строки и т. Д., Это 99% случаи, когда возникает эта ошибка.
Это распространенный сценарий, при котором возникает эта ошибка: у меня есть
UINavigationController
и у меня естьUITableView
, когда я нажимаю на строку, она выталкивает новуюUITableView
и так далее. Эта ошибка всегда случается со мной, когда я открываю последнююUITableview
и возвращаюсь к предыдущейUITableView
, на этом этапе я делаю ненужный вызовloadIt
функции, которая в основном вставляет строки и повторно загружаетUITableView
.Причина этого в том, что я ошибочно помещаю свою функцию loadIt
viewDidAppear:animated
вместоviewDidLoad
.viewDidAppear:animated
вызывается каждый раз, когдаUITableView
отображается,viewDidLoad
вызывается только один раз.источник
При удалении строк помните, что он также проверяет разделы при обновлении, в:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView
Если вы хотите удалить строку, которая является последним элементом в разделе, вам нужно вместо этого удалить весь раздел (в противном случае счетчик разделов может быть неверным и возникнет это исключение).
источник
Не забудьте обновить свой массив, который определяет numberOfRowsInSection. Его необходимо обновить перед анимацией и удалением
Мы проверяем, равно ли количество строк в разделе 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];
источник
Я помещаю элементы каждого раздела в отдельные массивы. Затем поместите их в другой массив (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];
источник
У меня была такая же ошибка.
Я использовал следующие строки
UINib *myCustomCellNib = [UINib nibWithNibName:@"CustomNib" bundle:nil]; [tableView registerNib:myCustomCellNib forCellReuseIdentifier:@"CustomNib"];
чтобы зарегистрировать перо в методе viewDidLoad, поскольку у меня был другой наконечник, который также был связан с тем же классом. Следовательно, строка
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GBFBLoadingCell"];
возвращал nil, если я не зарегистрировал перо в viewDidLoad.
Моя проблема заключалась в том, что я забыл установить идентификатор в инспекторе атрибутов для моего файла «CustomNib.xib» и «CustomNib ~ iphone.xib». (Или, точнее, я забыл нажать Enter после ввода идентификатора в инспекторе атрибутов в XCode, так что новое имя не удалось сохранить.)
Надеюсь это поможет.
источник
Если вы используете
NSFetchedResultsController
подобное мне и обновляете данные в фоновом потоке, не забудьте начинать и заканчивать обновления в делегате:- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [self.tableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; }
источник
У меня была такая же ошибка, которая при попытке
[tableView reloadData]
сработала нормально. Ошибка действительно была в строке[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];
Когда я попытался проверить значения indexPath, они оказались неправильными.
Я исправил это, изменив значения в
indexPathsArray
.Надеюсь это поможет .
источник
Это может быть один из
UITableViewDataSource
методов протоколаЗа
он должен возвращать целое число, равное сумме или результату
-insertRowsAtIndexPaths:withRowAnimation:
и / или-deleteRowsAtIndexPaths:withRowAnimation
:За
он должен возвращать целое число, равное сумме или результату
-insertRowsAtIndexPaths:withRowAnimation:
и / или-deleteSections:withRowAnimation:
источник
У меня была такая же проблема с базой данных Core Data. Если вы используете много FRC, вам просто нужно перезагрузить tableview внутри каждого условия в numberOfSectionsInTableView.
источник
Это случилось со мной, когда я использовал Swift и хранилище данных с поддержкой FRC для управления информацией. Добавление простой проверки к операции удаления для оценки текущего 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) }
источник
Просто убедитесь, что вы вызываете [yourTableView reloadData]; после модификации массива значений.
источник