2

デリゲートメソッドの外でUITableviewから行を削除しようとしています。テーブルセル内のボタンをクリックして、そのメソッド内の行を削除しようとすると、メソッドを呼び出しています。これが私が使っている関数です

UIButton *btn = (UIButton*)sender;
int tag = btn.tag;
UITableViewCell *buttonCell = (UITableViewCell*)[[btn superview] superview];
NSIndexPath *indexPath = [self.msgTbl indexPathForCell:buttonCell];
[deleg.rmessages removeObjectAtIndex:buttonRow];
[self.msgTbl deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];NSInteger buttonRow = indexPath.row;
[self.msgTbl reloadData];

この1つまたは2つの行を使用すると削除されますが、その後クラッシュして例外が発生します

削除前後の行数は同じである必要があります

iOSでこれを行うにはどうすればよいですか?ありがとう

4

2 に答える 2

3

問題は、セルを削除した後、テーブルにデータを入力するために取得されているデータがテーブルと一致していないことです。これを行った後、dataSourceメソッドが正しいデータを提供することを確認してください(たとえば、テーブルへの入力に使用しているオブジェクトの配列の場合は、そのオブジェクトも配列から削除する必要があります)

于 2011-10-16T13:35:00.840 に答える
1

根本的な問題は、この方法です。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

正しい行数を返す必要がありますが、そうではありません。からアイテムを削除すると、deleg.rmessagesこれは上記のメソッドの戻り値を提供するために使用されているのと同じオブジェクトですか?([deleg.rmessages count]?のようなもの)

また、私の経験では、その例外により、特に次のような詳細が得られることがよくあります。

  1. 以前に持っていたアイテムの数
  2. 追加/削除された数
  3. 予想される数とリロード後の数

このようなことが言及されているのを見ますか?もしそうなら、それはあなたの質問に含める価値があるでしょう。

サイドノート:

信頼するのは悪い考えです:

UITableViewCell *buttonCell = (UITableViewCell*)[[btn superview] superview];

を返すにはUITableViewCell。ボタンのをローカル変数に割り当てているように見えtagますが、決して使用しないでください。(おそらく、これはUITableViewCellのインデックスを格納し、セルをサブクラス化してボタンへのivarを維持するのに適した場所でしょうか?)これは問題の一部にすぎません。

于 2011-10-16T13:40:09.490 に答える