it-roy-ru.com

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

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

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

Спасибо

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 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
86
Scubadivingfool

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

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

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

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

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

42
pbx

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

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

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

26
abbood

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

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

24
Olof_t

Не забудьте обновить ваш массив, который определяет 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];
6
love2script12

Я помещаю элементы каждого раздела в отдельные массивы. Затем поместите их в другой массив (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];
4
Khwarezm Shah

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

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

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

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

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

2
user5553647

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

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

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, чтобы новое имя не удалось сохранить.)

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

2
user1612868

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

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

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

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

За 

- tableView:numberOfRowsInSection:

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

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

For

- numberOfSectionsInTableView:

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

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

1
Ted

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

0
Privatus Privatus

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

            }
0
Tommie C.

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

0
Evgeniy Kleban