Ошибка подтверждения в - [UITableView _endCellAnimationsWithContext:]

Надеюсь, это будет быстрое решение. Я пытался выяснить ошибку, которую я продолжаю получать. Ошибка указана ниже, а приложение applalagate ниже этого.

Любая помощь приветствуется.

Спасибо

  

2012-04-12 21: 11: 52.669 Чанда [75100: f803] --- Ошибка подтверждения в -[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
86 голосов | спросил Scubadivingfool 13 AMpFri, 13 Apr 2012 07:27:12 +040027Friday 2012, 07:27:12

12 ответов


0

Я не вижу причины для вас, чтобы показать нам эту часть кода. Я предполагаю, что ваша ошибка связана с этой частью в вашем коде

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

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

Возможно, вы допустили ошибку в одном из этих методов источника данных. В настоящее время невозможно сказать, что именно не так, но я предполагаю, что это может быть что-то вроде: Вы говорите табличное представление в numberOfRowsInSection хотел бы зарезервировать и настроить строки n , а в cellForRowAtIndexPath вы будете обрабатывать только n - 1. строки, например.

Извините, что этот ответ не может быть таким точным, каким он должен быть. Если вы покажете нам свою реализацию своего источника данных, было бы намного легче рассказать, что происходит.

ответил pbx 14 J0000006Europe/Moscow 2012, 11:50:47
0

Как Сунь Цзы сказал : лучше победить, не сражаясь . В моем случае всякий раз, когда я вижу такого рода сообщения об ошибках (например, несоответствие между удаленными строками и т. Д.) .. Я даже ничего не отлаживаю ... Я просто избегаю дополнительного вызова, когда перезагружаю строки и т. Д., Это 99% случаи, когда происходит эта ошибка.

Это распространенный сценарий, когда эта ошибка возникает: у меня есть UINavigationController, и у него есть UITableView, когда я нажимаю на строку, она выдвигает новый UITableView и т. Д. , Эта ошибка всегда происходит со мной, когда я выскакиваю последний UITableview и возвращаюсь к UITableView перед этим, в этот момент я делаю ненужный вызов функции loadIt, которая в основном вставляет строк и передает UITableView.

Причина, по которой это происходит, заключается в том, что я ошибочно помещаю свою функцию loadIt в viewDidAppear:animated, а не в viewDidLoad. viewDidAppear:animated вызывается каждый раз, когда UITableView отображается viewDidLoad только один раз.

ответил abbood 2 PMpTue, 02 Apr 2013 16:33:31 +040033Tuesday 2013, 16:33:31
0

При удалении строк помните, что он также проверяет разделы при обновлении, в:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

Если вы хотите удалить строку, которая является последним элементом в разделе, вам нужно вместо этого удалить весь раздел (в противном случае это может привести к неправильному счетчику разделов и вызвать это исключение).

ответил Olof_t 4 Jpm1000000pmFri, 04 Jan 2013 20:42:07 +040013 2013, 20:42:07
0

Не забудьте обновить массив, который определяет 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];
ответил love2script12 12 32014vEurope/Moscow11bEurope/MoscowWed, 12 Nov 2014 14:44:06 +0300 2014, 14:44:06
0

Я помещаю элементы каждого раздела в отдельные массивы. Затем поместите их в другой массив (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];
ответил Khwarezm Shah 29 MarpmFri, 29 Mar 2013 15:48:34 +04002013-03-29T15:48:34+04:0003 2013, 15:48:34
0

У меня была такая же ошибка.

Я использовал следующие строки

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

чтобы зарегистрировать перо в методе viewDidLoad, поскольку у меня был другой кончик, который также был связан с тем же классом. Следовательно, линия

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

возвращал ноль, если я не зарегистрировал перо в viewDidLoad.

Моя проблема заключалась в том, что я забыл установить идентификатор в инспекторе атрибутов для моих файлов "CustomNib.xib" и "CustomNib ~ iphone.xib". (Или, точнее, я забыл нажать клавишу ввода после ввода идентификатора в инспекторе атрибутов в XCode, чтобы новое имя не удалось сохранить.)

Надеюсь, это поможет.

ответил user1612868 18 J0000006Europe/Moscow 2013, 02:23:59
0

У меня была та же ошибка, которая при попытке с [tableView reloadData] работала нормально. Ошибка была на самом деле в строке

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

Когда я попытался проверить значения indexPath, они не были корректными, как требовалось.

Я исправил это, изменив значения в indexPathsArray.

Надеюсь, это поможет.

ответил user5553647 31 Maypm16 2016, 14:45:27
0

Это может быть один из UITableViewDataSource методов протокола

Для

- tableView:numberOfRowsInSection:

должно возвращать целое число, равное сумме или результату

-insertRowsAtIndexPaths:withRowAnimation: и /или -deleteRowsAtIndexPaths:withRowAnimation

Для

- numberOfSectionsInTableView:

должно возвращать целое число, равное сумме или результату

-insertRowsAtIndexPaths:withRowAnimation: и /или -deleteSections:withRowAnimation:

ответил Ted 17 Jam1000000amSun, 17 Jan 2016 10:30:22 +030016 2016, 10:30:22
0

Если вы используете NSFetchedResultsController, как я, и обновляете данные в фоновом потоке, не забудьте начать и завершить обновления в делегате:

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

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
ответил mikeho 23 Jam1000000amSat, 23 Jan 2016 02:59:51 +030016 2016, 02:59:51
0

У меня была такая же проблема с базовой базой данных. Если вы используете много FRC, вам просто нужно перезагрузить представление таблицы внутри каждого условия в numberOfSectionsInTableView.

ответил Privatus Privatus 30 +04002013-10-30T08:39:03+04:00312013bEurope/MoscowWed, 30 Oct 2013 08:39:03 +0400 2013, 08:39:03
0

Я только что это случилось со мной, когда использовал 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)

            }
ответил Tommie C. 22 FebruaryEurope/MoscowbSun, 22 Feb 2015 06:33:56 +0300000000amSun, 22 Feb 2015 06:33:56 +030015 2015, 06:33:56
0

Просто убедитесь, что вы вызываете [yourTableView reloadData]; после изменения массива значений.

ответил Evgeniy Kleban 7 PMpThu, 07 Apr 2016 17:26:45 +030026Thursday 2016, 17:26:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132