うまくいけば、これは簡単な修正になるでしょう。私は取得し続けているエラーを把握しようとしています。エラーは下にリストされ、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
Sun Tzuのように said :戦闘しないで勝つことが最善です。私の場合、この種のエラーメッセージが表示されるたびに(つまり、追加された行の不一致など)..デバッグすらしません。行をリロードするなどの余分な呼び出しは避けます。このエラーが発生するケース。
これは、このバグが発生する一般的なシナリオです。UINavigationController
があり、UITableView
があります。行をクリックすると、新しいUITableView
などがプッシュされます。このエラーは、最後のUITableview
をポップし、その前のUITableView
に戻ると常に発生します。この時点で、基本的に行を挿入するloadIt
関数を不必要に呼び出しますUITableView
を再配置します。
これが起こる理由は、loadIt関数をviewDidLoad
ではなくviewDidAppear:animated
に誤って配置したためです。 viewDidAppear:animated
は、UITableView
が表示されるたびに呼び出され、viewDidLoad
は1回だけ呼び出されます。
行を削除する場合、更新時にセクションもチェックすることに注意してください。
- (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];
私のようなNSFetchedResultsController
を使用し、バックグラウンドスレッドでデータを更新する場合は、デリゲートで更新を開始および終了することを忘れないでください。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
同じエラーがありました。[tableView reloadData]
で試してみたところ、うまくいきました。エラーは実際に行にありました
[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];
IndexPathの値を確認しようとしたときに、必要に応じて値が正しくありませんでした。
indexPathsArray
の値を変更して修正しました。
お役に立てれば 。
同じエラーが発生しました。
私は次の行を使用していました
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キーを押すのを忘れていたため、新しい名前を保存できませんでした。)
お役に立てれば。
UITableViewDataSource
プロトコルメソッドのいずれか
For
- tableView:numberOfRowsInSection:
の合計または結果に等しい整数を返す必要があります
-insertRowsAtIndexPaths:withRowAnimation:
および/または-deleteRowsAtIndexPaths:withRowAnimation
:
For
- numberOfSectionsInTableView:
の合計または結果に等しい整数を返す必要があります
-insertRowsAtIndexPaths:withRowAnimation:
および/または-deleteSections:withRowAnimation:
コアデータベースでも同じ問題が発生しました。多くのFRCを使用している場合、numberOfSectionsInTableViewの各条件内でテーブルビューを再ロードする必要があります。
情報を管理するために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)
}
[yourTableView reloadData]を呼び出すことを確認してください。値の配列を変更した後。