2009-06-16 16 views
13

この問題は、私が最後の時間に忙しかったです。私は各セクションに1つの行を持つ2つのセクションを持っています。セクションの1つで行を削除すると、これが無効な更新であるという例外がスローされます(更新前後の行数/セクション数は同じではありません)。これは、セクションの最後の行を削除するとわかりますので、セクションを削除します。問題は例外を回避する方法です。セクションの最後の行を削除するには?

データソースはすべて問題ありません。私はチェックして再確認した(私を信じて)。

スレッドのタイトルとして、例外を発生させずにセクションの最後の行をどのように削除しますか?

おかげで、

バート

+0

「スレッドのタイトル」これは、質問と回答のサイトですフォーラムではありません。あなたは質問のタイトルを意味します。 –

答えて

26

あなたが行を削除し、この行は、そのセクションの最後のものであるとき、あなたはまた、セクションを削除する必要があります。基本的には、削除するindexPath、つまり行に関連付けられているindexPathと、行が含まれていないため削除する必要があるセクションに関連するインデックスの両方を追跡する必要があります。次のようにあなたがそれを行うことができます。arrayカウントがゼロである場合

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

あなたがのtableViewの特定のセクションに関連したモデル配列からオブジェクトを削除するたびに、その場合には、セクションを示す指標を追加し、確認してくださいインデックスに:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

次のようにtableViewを更新し、その後、削除したい行に関連indexPathsのすべてを決定します

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

これは私とOのために働いていました私はそのアプローチを提案しました。

+0

このオプションは機能しますが、最後のセクションを削除すると別の例外がスローされます(ただし、これを解決する方法がわかります)。私はこれが唯一の方法だと信じるのは難しいと思う。それはとても不愉快な/不気味なようです。それだけでは機能しません;-)。しかし、あなたの入力をありがとう。 –

+2

これに追加するには、セクションの最後の行を削除するときに、私はdeleteSections:withRowAnimation:のみを呼び出します。私はdeleteRowsAtIndexPaths:withRowAnimation:を呼び出さない。アニメーションは同じように見えますが、例外は発生しません。 – Alex

+0

最後のセクションの最後の行を削除するにはどうしたらいいですか? –

1

おそらくこれはあなたのために働く可能性があります

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [self.keys objectAtIndex:section]; 
    NSMutableArray *rowsInSection = [self.dict objectForKey:key]; 
    [rowsInSection removeObjectAtIndex:row]; 

    NSUInteger rowsInSectionCount = [rowsInSection count]; 

    if (rowsInSectionCount > 0) { 
     // If we still have rows in this section just delete the row 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    else { 
     // There are no more rows in this section 
     [self.dict removeObjectForKey:key]; 
     [self.keys removeObjectAtIndex:section]; 

     NSUInteger sectionCount = [self.keys count]; 

     if (sectionCount > 0) { 
      // If we still have 1 or more sections left just delete this section 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else { 
      // If there are no more rows and sections left just delete the last row 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView reloadData]; 
     } 
    } 
} 

ホープこれはあなたが探していたものです。モデル内のデータを削除した後、スウィフト2については

// Either delete some rows within a section (leaving at least one) or the entire section. 
    if ([indexPath section] < 0) { 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if ([indexPath section] == 0) { 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
1

tableView.beginUpdates()      

    let indexSet = NSMutableIndexSet() 
    indexSet.addIndex(indexPath.section) 
    tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade) 

    tableView.endUpdates() 
1

:この1つは、トリックを行う必要があります

関連する問題