web-dev-qa-db-ja.com

-[UITableView _endCellAnimationsWithContext:]でのアサーションエラー

うまくいけば、これは簡単な修正になるでしょう。私は取得し続けているエラーを把握しようとしています。エラーは下にリストされ、appdelagateはその下にあります。

どんな助けも大歓迎です。

ありがとう

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

Sun Tzuのように said戦闘しないで勝つことが最善です。私の場合、この種のエラーメッセージが表示されるたびに(つまり、追加された行の不一致など)..デバッグすらしません。行をリロードするなどの余分な呼び出しは避けます。このエラーが発生するケース。

これは、このバグが発生する一般的なシナリオです。UINavigationControllerがあり、UITableViewがあります。行をクリックすると、新しいUITableViewなどがプッシュされます。このエラーは、最後のUITableviewをポップし、その前のUITableViewに戻ると常に発生します。この時点で、基本的に行を挿入するloadIt関数を不必要に呼び出しますUITableViewを再配置します。

これが起こる理由は、loadIt関数をviewDidLoadではなくviewDidAppear:animatedに誤って配置したためです。 viewDidAppear:animatedは、UITableViewが表示されるたびに呼び出され、viewDidLoadは1回だけ呼び出されます。

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
K S

私のようなNSFetchedResultsControllerを使用し、バックグラウンドスレッドでデータを更新する場合は、デリゲートで更新を開始および終了することを忘れないでください。

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

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

同じエラーがありました。[tableView reloadData]で試してみたところ、うまくいきました。エラーは実際に行にありました

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

IndexPathの値を確認しようとしたときに、必要に応じて値が正しくありませんでした。

indexPathsArrayの値を変更して修正しました。

お役に立てれば 。

2
user5553647

同じエラーが発生しました。

私は次の行を使用していました

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

同じクラスに関連付けられた別のnibがあるため、viewDidLoadメソッドでnibを登録します。したがって、行

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

viewDidLoadでnibを登録しない限り、nilを返していました。

私の問題は、ファイル「CustomNib.xib」および「CustomNib〜iphone.xib」の属性インスペクターに識別子を設定するのを忘れたことです。 (より正確には、XCodeの属性インスペクターに識別子を入力した後にEnterキーを押すのを忘れていたため、新しい名前を保存できませんでした。)

お役に立てれば。

2
user1612868

UITableViewDataSourceプロトコルメソッドのいずれか

For

- tableView:numberOfRowsInSection:

の合計または結果に等しい整数を返す必要があります

-insertRowsAtIndexPaths:withRowAnimation:および/または-deleteRowsAtIndexPaths:withRowAnimation

For

- numberOfSectionsInTableView:

の合計または結果に等しい整数を返す必要があります

-insertRowsAtIndexPaths:withRowAnimation:および/または-deleteSections:withRowAnimation:

1
Ted

コアデータベースでも同じ問題が発生しました。多くのFRCを使用している場合、numberOfSectionsInTableViewの各条件内でテーブルビューを再ロードする必要があります。

0

情報を管理するためにSwiftとFRCでバックアップされたデータストアを使用しているときに、これが起こったのです。現在のindexPath.sectionを評価するために削除操作に簡単なチェックを追加することで、余分な呼び出しを回避できました。この問題が発生する理由は理解できたと思います...基本的に、データセットが空の場合は常に、一番上の行にメッセージを読み込みます。偽の行があるため、これにより1つの問題が発生します。

私の解決策

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