2012-03-24 9 views
2

私はアプリにいくつかのUITableViewを持っていて、削除するためにスワイプがうまくいっています。クラッシュ時にスワイプして削除する

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-1914.84/UITableView.m:833 
2012-03-24 16:20:03.158 [22339:707] Exception - attempt to delete row 3 from section 0 which only contains 3 rows before the update - attempt to delete row 3 from section 0 which only contains 3 rows before the update 

cellForRowAtIndexPath, commitEditingStyleeditingStyleForRowAtIndexPathクラッシュする前に呼ばれているどちらも、そのクラッシュなどは、任意の前に起こります。問題は、私が(下部)空のセルの上にスワイプしようとすると、アプリはちょうどでクラッシュし、あります私のメソッドは呼び出すことができます。

参考のために、私はeditingStyleForRowAtIndexPath

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ((indexPath.row == self.insertIndex && indexPath.section == [self.sections count] -1) || (indexPath.row == 0 && [sections count]==0)) { // last row of section, or only row of only section 
     return UITableViewCellEditingStyleInsert; 
    } else { 
     return UITableViewCellEditingStyleDelete; 
    } 
} 

でこれを持っているUPDATE:時にテーブルビューのスクロールアプリは事実上使用不可能であるように、これは、実際には大きな問題です。

+0

あなたはeditingStyleForRowAtIndexPath – Darren

+0

でなければならないのは何のコード私は、コードを追加しましたが、それは呼ばれていますアプリがクラッシュする前に。 – Echilon

+0

どのメソッドも呼び出されていない場合は、デリゲートが正しく設定されていますか? – Darren

答えて

11

これは、リフレッシュ中にテーブルビューで行をリロードしようとした根本的な原因のようです。何らかの種類の矛盾した状態があったに違いありませんでした。その結果、毎回アプリがクラッシュしました。

+0

私はちょうど同じ問題を抱えていました。私のcommitEditingStyleコードを削除するには、中央記憶域オブジェクトから行を削除するメソッドを呼び出します。中央ストレージオブジェクトは、データを使用するすべてのテーブルビューをリフレッシュするために削除を通知する通知を有する。私は[tableView deleteRowsAtIndexPaths:...行と問題を解決したとコメントしました。私はこれが将来的にいくつかの問題を引き起こすかどうかはわかりません。なぜなら今、テーブルビューはその通知を送信するデータストアに依存しているからです。 –

+0

私は別の変更を行いました。ちょうど場合には、セントラルストレージオブジェクトロジックが変更され、通知をtableViewに送り返しませんでした。だから、私は[tableView deleteRowsAtIndexPaths:...行を入れて、同時にreloadDataと呼ばれる通知呼び出しハンドラにチェックを入れて、テーブルが編集中の場合、つまりテーブルisEditing = YESをリロードしないようにします。今ストレージオブジェクトがその通知メッセージを送信しない場合、テーブルビューコードは不整合状態でクラッシュしません –

+0

また、私のケースではUICollectionView – Ryan

0

ソリューション:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ 
// tableView.isEditing ? NSLog(@"show edit controls"):NSLog(@"don't show edit controls"); 

    if(tableView.isEditing){ 
     return NO; 
    }else{ 
     return YES; 
    } 
} 
関連する問題