0

に問題がありますUITableview。スクロールしたりスイッチを押したりすると、セルが混同されることがあります。したがって、あるセルのテキストが別のセルに表示されるようにすることができます。tableView についてよく読みましたが、自分のコードに合うものは何も見つかりませんでした。ここにあります:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

}

    if (indexPath.section == 0) {
        if (indexPath.row == 0) {
            cell.textLabel.text = NSLocalizedString(@"Course:",@"Course Section");
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = entryTableCourseName;

        }

       else if (indexPath.row == 1) {
            cell.textLabel.text = @"Due Date:";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = entryTableDueDateString;            }
    }

    else if (indexPath.section == 1) {
        if (indexPath.row == 0) {
            //cell.textLabel.text = NSLocalizedString(@"Title", @"entryTableTaskTitle");
            [cell.contentView addSubview:nameField];

        }

        else if (indexPath.row == 1) {
            [cell.contentView addSubview:TaskView];
        }

    }


    else if (indexPath.section == 2) {

        if (entryTableGradeSwitch.on) {
            if (indexPath.row == 0) {
                cell.textLabel.text = NSLocalizedString(@"Grading", @"GradingCell");
                cell.accessoryView = entryTableGradeSwitch;
            }
            else if (indexPath.row == 1) {
                cell.textLabel.text = NSLocalizedString(@"Options", @"GradingCellOptions");
            }
        }
        else {
            cell.textLabel.text = NSLocalizedString(@"Grading", @"GradingCell");
            cell.accessoryView = entryTableGradeSwitch;
        }
    }

}

セルのセットアップで何か本当に間違ったことをしているように感じます。

4

4 に答える 4

2

それはすべて、細胞の再利用性によるものです。StackOverflow にはこれに関する投稿がたくさんあります。「UITableViewCell Reusability Problems」を検索することをお勧めします。解決策が見つかります。

要するに..ここで何が起こるかというと、スクロールしているときに、セルは基本的にそのindexPathで以前に使用されたセルを再利用し、cellForRowAtIndexPathはそのindexpathで別のセルを割り当てます。

解決 ?

  1. セルごとに異なる再利用識別子を使用します。
  2. めちゃくちゃになっているビューまたはラベルで tableViewCell をサブクラス化します。
于 2012-06-06T17:21:15.457 に答える
1

必ず実装してください

- (void) prepareForReuse

あなたがそれらを再利用する場合、あなたのセルで。このルーチンでは、別の再利用で表示したくないセルに追加したものをすべてクリーンアップします。カスタム項目を追加しない場合は、セルにデータを入力するときに、セルが空であってもすべてを設定するようにしてください。

于 2012-06-06T18:27:00.180 に答える
0

これを行うたびに:

 [cell.contentView addSubview:TaskView]

またはそのようなもので、セルに新しいサブビューを追加しています。セルが再利用されるにつれて、サブビューをどんどん追加します。

あなたのコードからは、nameView と taskView がどこから来たのかさえ明確ではありません。それらは、セルが最初に作成されたときに一度追加され、その後構成されるか、xib またはストーリーボードで設計されたセルの一部である必要があります。

于 2012-06-06T17:26:01.540 に答える
0

これに対する非常に簡単な修正方法があります。再利用識別子を引き続き保持できます。また、サブクラス化などは必要ありません。

簡単です。すべてのラベルとビューを確認して設定するだけです。これは、1 つのセルが詳細テキスト ラベルを使用しない場合でも、それを に設定することを意味し@""ます。これにより、以前にセルを使用したコンテンツの残りのデータが残っていないことを確認できます。

とてもシンプルで、いつでも機能します!また、セルを再利用しないよりもはるかに優れたリソースです。

于 2013-05-21T04:39:56.303 に答える