2

再利用可能なセルでテーブルビューを使用します。各セルには、テキストを含むtextFieldがあり、これを変更できます。テキストが空の場合、そのセルを削除します。

100行あり、行番号1を変更するとします。それをタップし、空の文字列@ ""を指定し、位置番号50まで下にスクロールして、このセルをタップします。

これから、別のセルでタップジェスチャを検出し、メソッドtextFieldDidEndEditingを呼び出します。このセルをテーブルビューから削除する必要があるかどうかを確認します。cellForRowAtIndexPath:を使用して、変更されたセルを取得します。

問題は、textFieldが空のセルが他に表示されることです。変更したセルを削除しますが、1つだけです。これは再利用可能なセルの問題だと思います。

誰かがこの問題で私を助けることができますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ImageIdentyfier = @"StandardCellWithImageIdentifier";

    StandardCellWithImage *cellImage = (StandardCellWithImage *)[tableView dequeueReusableCellWithIdentifier:ImageIdentyfier];

    if(cellImage == nil) {
        cellImage = [[StandardCellWithImage alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageIdentyfier];
    }
    cellImage.nameLabel.delegate = self;
    Item *item  = [self.mutableFetchResults objectAtIndex:indexPath.row];
    cellImage.nameLabel.text = item.itemText;
    cellImage.infoLabel.text = item.itemInfo;
    cellImage.checkbox.userInteractionEnabled = YES;
    cellImage.nameLabel.userInteractionEnabled = NO;
    if(item.itemIsChecked.boolValue == YES) {
        cellImage.checkbox.tag = indexPath.row;
        [cellImage.tapGesture addTarget:self action:@selector(didSelectedImageAtIndexPath:)];
        cellImage.checkbox.image = [UIImage imageNamed:@"checkbox-checked.png"];
    } else {
        cellImage.checkbox.tag = indexPath.row;
        [cellImage.tapGesture addTarget:self action:@selector(didSelectedImageAtIndexPath:)];
        cellImage.checkbox.image = [UIImage imageNamed:@"open-checkbox.png"];
    }
    return cellImage;
}
4

2 に答える 2

1

行1から行50にスクロールすると、既存のセルが再利用されます-空のtextFieldを持つセルも含まれます。これが、何度も表示される理由であり、削除ルーチンがすべてではなく1つだけを削除した理由です。

メソッドでのセルの作成は、cellForRowAtIndexPath空のテキストフィールドがリサイクルされたセルに自動的にコピーされないように修正する必要があるようです。コードを見ることなく、この演習はあなたに任されています。

コードを見て、ありがとう。「簡単な」修正が見つからなかったため、問題を回避することを提案します。したがって、セルタップをチェックする代わりに、リストのスクロールをチェックする必要があるかもしれません。

あなたが抱えている問題は、編集中のセルがユーザーがリストをスクロールしたためにリサイクルされたためにのみ存在します。したがって、a)テキストの編集中にユーザーにスクロールを許可しない、またはb)ユーザーがスクロールを開始したときにテキストの編集を停止することにより、問題を解決します。

于 2013-02-06T09:54:32.373 に答える
1

あなたtextFieldDidEndEditingがfinishを呼び出されたら、テキストが""そうであるかどうかを確認する必要があり""ます。dataSourcereloadData

あなたの- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドはこのように書くべきです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    XXXXXXXCell *cell = [tableView dequeueReusableCellWithIdentifier: kIdentifier];
    if (cell == nil) {

        //Init cell, only init

    }

    //Setup the cells detail, such as the textField.text and so on

    return cell;

}
于 2013-02-06T10:05:38.817 に答える