2

私のコスチュームはテーブルビューエディションモードで提供される赤い円を望んでいないため、アプリにカスタム削除プロセスを実装しようとしています。タグプロパティに行番号を使用して、すべての行に削除ボタンを追加しました。ユーザーが削除ボタンをクリックすると、次の方法で起動します。

-(IBAction)deleteRow:(id)sender{

    UIButton *tempButton = (UIButton*)sender;

   [self updateTotals];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0];

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

    [tableView reloadData];

    [sharedCompra removeItem:tempButton.tag];

    tempButton=nil;


}

そして、私はいつもこのエラーを受け取ります:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), 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).'

したがって、このコードに何かが欠けているかどうかはわかりません。

どうもありがとう。

4

3 に答える 3

12

データソースが元の状態(つまり、削除前の状態)を反映しているのに、行を削除しようとしています。最初にデータソースを更新する必要があります。その後、テーブルvievから削除を発行できます。また、ボタンをに設定する必要も、テーブルビューnilを呼び出す必要もありません。- reloadData

- (void)deleteRow:(id)sender
{
    UIButton *tempButton = sender;
    [self updateTotals];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0];
    [sharedCompra removeItem:tempButton.tag];

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

(ただし、実行する必要があることの1つは、コードのフォーマット方法に注意を払うことです。

于 2012-11-10T17:09:47.743 に答える
1

[sharedCompra removeItem:tempButton.tag];前に電話し[tableView deleteRowsAtIndexPaths...[tableView reloadData]

問題は、呼び出すと、モデルから同じカウントを返すdeleteRowsAtIndexPath:呼び出しであるということです。numberOfRowsInSection

またreloadData、ここでは電話は必要ありません。

于 2012-11-10T17:07:33.753 に答える
0

行を削除および追加するときは、beginUpdatesを呼び出す必要があります。ここではどのように表示されるかを示します。

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

また、reloadDataを呼び出す必要はありません。そうしないと、deleteRowsメソッドとinsertRowsメソッドのアニメーションがキャンセルされます。ただし、データをリセットする必要があるため、NSMutableArrayを使用している場合は、最初にオブジェクトを削除する必要があります。つまり、インデックス0のアイテムを削除してから、テーブルの行0を削除できます。行数は、削除が終了したときにその配列内のオブジェクトの数と一致する必要があります。一致しないと、クラッシュします。

于 2012-11-10T17:12:11.233 に答える