と削除セクションを更新のUITableView:アニメーション
私は、以下の答えとして、この問題に対する私の解決策を掲載しています。私の最初の改訂とは異なるアプローチをとっています。
私は以前、私は私の問題を解決思っように質問をし 元の質問は:のUITableViewからセクションを削除するとき
How to deal with non-visible rows during row deletion. (UITableViews)
しかし、私は今、再び同様の問題を抱えています。 (テーブルのセクション数/行数を変更したときに再表示されます)。
私の郵便物のせん断長さのためにあなたを失う前に、私は問題をはっきりと述べ、答えを出すのに必要なだけ読むことができます。
問題:時々
バッチのUITableView、アプリケーションのクラッシュからの行やセクションを削除する場合は、。これは、テーブルの構成と、削除する行とセクションの組み合わせによって異なります。あなたは明白な答えを書く前に、私は私が実際に追加したお約束し、削除し、今すぐ
Invalid update: invalid number of rows in section 5. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).
:
ログには、それは私がデータソースと適切にテーブルを更新していないと言うので、私は墜落したと言います行とセクションを適切にdataSourceから取得します。説明は時間がかかりますが、この方法に従えば、以下で説明します。
- (void)createFilteredTableGroups{
//index set to hold sections to remove for deletion animation
NSMutableIndexSet *sectionsToDelete = [NSMutableIndexSet indexSet];
[sectionsToDelete removeIndex:0];
//array to track cells for deletion animation
NSMutableArray *cellsToDelete = [NSMutableArray array];
//array to track controllers to delete from presentation model
NSMutableArray *controllersToDelete = [NSMutableArray array];
//for each section
for(NSUInteger i=0; i<[tableGroups count];i++){
NSMutableArray *section = [tableGroups objectAtIndex:i];
//controllers to remove
NSMutableIndexSet *controllersToDeleteInCurrentSection = [NSMutableIndexSet indexSet];
[controllersToDeleteInCurrentSection removeIndex:0];
NSUInteger indexOfController = 0;
//for each cell controller
for(ScheduleCellController *cellController in section){
//bool indicating whether the cell controller's cell should be removed
NSString *shouldDisplayString = (NSString*)[[cellController model] objectForKey:@"filteredDataSet"];
BOOL shouldDisplay = [shouldDisplayString boolValue];
//if it should be removed
if(!shouldDisplay){
NSIndexPath *cellPath = [self indexPathOfCellWithCellController:cellController];
//if cell is on screen, mark for animated deletion
if(cellPath!=nil)
[cellsToDelete addObject:cellPath];
//marking controller for deleting from presentation model
[controllersToDeleteInCurrentSection addIndex:indexOfController];
}
indexOfController++;
}
//if removing all items in section, add section to removed in animation
if([controllersToDeleteInCurrentSection count]==[section count])
[sectionsToDelete addIndex:i];
[controllersToDelete addObject:controllersToDeleteInCurrentSection];
}
//copy the unfiltered data so we can remove the data that we want to filter out
NSMutableArray *newHeaders = [tableHeaders mutableCopy];
NSMutableArray *newTableGroups = [[allTableGroups mutableCopy] autorelease];
//removing controllers
int i = 0;
for(NSMutableArray *section in newTableGroups){
NSIndexSet *indexesToDelete = [controllersToDelete objectAtIndex:i];
[section removeObjectsAtIndexes:indexesToDelete];
i++;
}
//removing empty sections and cooresponding headers
[newHeaders removeObjectsAtIndexes:sectionsToDelete];
[newTableGroups removeObjectsAtIndexes:sectionsToDelete];
//update headers
[tableHeaders release];
tableHeaders = newHeaders;
//storing filtered table groups
self.filteredTableGroups = newTableGroups;
//filtering animation and presentation model update
[self.tableView beginUpdates];
tableGroups = self.filteredTableGroups;
[self.tableView deleteSections:sectionsToDelete withRowAnimation:UITableViewRowAnimationTop];
[self.tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];
//marking table as filtered
self.tableIsFiltered = YES;
}
私の推測:
セクションと行の削除を処理している、あなたはまだ興味を持っている場合...はメソッドとそう
probl私は各セクションのセルの数をリストしたところを見れば、セクション5が1ずつ増加するように見えます。しかし、これは当てはまりません。元のセクション5は実際に削除され、別のセクションが代わりに使用されています(具体的には、古いセクション10です)。
なぜ、テーブルビューはこれを認識していないようですか?古いセクションとを削除しても、削除されたセクションの行数でバインドされる古いセクションのインデックスにある新しいセクションは期待できません。
うまくいけば、これは意味をなさないが、これを書くのはちょっと複雑です。
(このコードは以前は別の数の行/セクションで動作していましたが、
代わりに、取り除く必要のある各セルのindexPathを追跡し、削除の進行に合わせて適切に調整します。 (これは長い/畳み込み/不適切な方法かもしれません - ちょっと考えてください) – Tim
私はバッチ削除を行っていますので、操作のリストの順序に違いはありません。テーブルビューは、更新ブロック内にあるときに「すぐに」操作を実行します。私は妄想だったので、私は操作の順序を無駄に切り替えることを試みました。セクション/行の番号付けは、バッチ削除中に切り替わらない(切り替えてはならない)。ブロックを使用していない場合、あなたは正しいでしょう。 –
@Tim興味深い考え。あなたが正しいです、それは削除(私は持っている)の大量で非常に退屈かもしれません。私はまた、私は迅速に連続して複数の削除を行うことができるかと思います。私はこれらの問題を避けるために一括削除をしようとしていましたが、必要かもしれません。 –