web-dev-qa-db-ja.com

'無効な更新:セクション0の行数が無効です

これに関するすべての関連記事を読みましたが、まだエラーが発生しています:

'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

詳細は次のとおりです。

.hNSMutableArrayがあります:

@property (strong,nonatomic) NSMutableArray *currentCart;

.m my numberOfRowsInSectionでは次のようになります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.


    return ([currentCart count]);

}

削除を有効にし、オブジェクトを配列から削除するには:

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [currentCart removeObjectAtIndex:indexPath.row];


    }
}

セクションの数を編集中の配列の数に依存させることで、適切な行数を確保できると思いましたか?とにかく行を削除するときにテーブルをリロードせずにこれを行うことはできませんか?

62
user3085646

データ配列からオブジェクトを削除する必要がありますbeforedeleteRowsAtIndexPaths:withRowAnimation:を呼び出します。したがって、コードは次のようになります。

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [currentCart removeObjectAtIndex:indexPath.row];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

配列作成ショートカット@[]を使用して、コードを少し単純化することもできます。

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
145
Undo

Swiftバージョン->呼び出す前にデータ配列からオブジェクトを削除します

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        print("Deleted")

        currentCart.remove(at: indexPath.row) //Remove element from your array 
        self.tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}