-1

セクションを展開および折りたたむ UITableView があります。各セクション ヘッダーは、実際には各セクションのインデックス 0 の行です。セクションに 6 つの項目が含まれているとします。ヘッダー行 (インデックス 0) をタップすると、さらに 6 つの行がセクションに追加され、合計で 7 つになります。これは美しく機能し、見栄えもよく、展開と折りたたみはスムーズできれいです。コードは主に、 https ://www.cocoanetics.com/2011/03/expandingcollapsing-tableview-sections で確認できる内容に基づいています。

これの重要な部分は、任意の時点で展開されるセクションのインデックスが NSMutableIndexSet に格納されることです。そのため、テーブル ビューが読み込まれるたびに、self.expandedSections をクエリして、フォルダーの内容を表示するすべての行を読み込むか、フォルダーの名前を含む最初の行だけを読み込むかを確認します。

問題は、ユーザーがフォルダーを削除する必要がある場合に発生します。テーブル ビューに、削除されるフォルダーよりも高いインデックスを持つ展開されたセクションが含まれている場合、次のようなクラッシュが発生します。

'無効な更新: セクション 1 の行数が無効です。更新後の既存のセクションに含まれる行数 (1) は、更新前にそのセクションに含まれる行数 (7) に、そのセクションから挿入または削除された行数 (0 挿入、0 削除) と、そのセクションに移動された、またはそのセクションから移動された行数 (0 移動され、0 移動された) をプラスまたはマイナスします。

このエラーは一目瞭然です。実際、Apple の誰かが可能な限り明確にするために何らかの努力を払っています。しかし、私はそれを回避する方法を見つけることができません。削除のコードは次のようになります。

if (editingStyle == UITableViewCellEditingStyleDelete)
{
    if (indexPath.row == 0) // we are deleting a folder
    {
        NSString *folderPath = [self.sectionHeaders objectAtIndex:indexPath.section];
        NSError *error = nil;
        if (![self.fileManager removeItemAtPath:folderPath error:&error]) [self.delegate alertForError:error];
        else
        {
            [self.sectionHeaders removeObjectAtIndex:indexPath.section]; // remove array reference to folder
            [self.expandedSections removeIndex:indexPath.section];

            // crashes if some other folder is displaying its contents
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
       }
    }
    else // we are deleting a file
    {
        etc...
    }
}

これは、tableView:commitEditingStyle:forRowAtIndexPath 内で呼び出されます。

どんな提案でも大歓迎です!

4

1 に答える 1