1

UITableViewCell1 から 70 までの数字を表示するようにサブクラス化しました。すべてのセルで、当選番号とチャンスの背景をチェックしています。問題は、数回スクロールすると、テーブルビューが非常に遅くなり、使用できなくなることです。私の理解では、セルを再利用しているため、理由がわかりません。毎回 70 個の UITextFields を作成しているからでしょうか?

お知らせ下さい

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

        ...

        ...

        SubCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
        if (cell == nil) {
            cell = [[SubCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
        }

        for(int i=0;i<7;i++)
        {
            for(int j=0;j<10;j++)
            {
                UITextField *tempField = [[UITextField alloc]initWithFrame:CGRectMake(2+(j*31), 4+(i*28), 30, 27)];
                [tempField setBorderStyle:UITextBorderStyleNone];
                [tempField setOpaque:YES];
                [tempField setTextAlignment:NSTextAlignmentCenter];
                [tempField setTextColor:[UIColor whiteColor]];
                [tempField setUserInteractionEnabled:NO];
                tempField.text = [NSString stringWithFormat:@"%d",i*10+j+1];
                if([[cell.currentWinningArray objectAtIndex:i*10+j] isEqualToString:@"0"])
                {
                   [tempField setBackground:[UIImage imageNamed:@"blue"]];
                }
                else
                    [tempField setBackground:[UIImage imageNamed:@"orange"]];

                [cell.contentView addSubview:tempField];
            }
        }
        return cell;
    }
4

1 に答える 1

3

セルの再利用が遅くなる理由は、セルを再利用した後でもサブビューを追加し続けるためです。セルが作成または再利用されるたびに、70 のサブビューが追加されますが、サブビューが削除されることはありません。新しく追加されたサブビューがその上にあるため、再利用されたセルからの「古い」サブビューは表示されませんが、古いサブビューはまだそこにあります。

セルが割り当てられたときに、サブビューを 1 回だけ作成して追加するようにコードを変更する必要があります。セルが再利用されるときは、ビュー内の値を変更する必要がありますが、ビュー自体は変更しないでください。

これを実現する 1 つの方法は、次tempFieldのように、それぞれに 0 ~ 69 のタグを付けることです。

SubCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if (cell == nil) {
    cell = [[SubCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<10;j++)
        {
            UITextField *tempField = [[UITextField alloc]initWithFrame:CGRectMake(2+(j*31), 4+(i*28), 30, 27)];
            [tempField setBorderStyle:UITextBorderStyleNone];
            [tempField setOpaque:YES];
            [tempField setTextAlignment:NSTextAlignmentCenter];
            [tempField setTextColor:[UIColor whiteColor]];
            [tempField setUserInteractionEnabled:NO];
            [tempField setTag:10*i+j];
            [cell.contentView addSubview:tempField];
        }
    }
}
for(int i=0;i<7;i++)
{
    for(int j=0;j<10;j++)
    {
        UITextField *tempField = [cell subviewWithTag:10*i+j];
        tempField.text = [NSString stringWithFormat:@"%d",i*10+j+1];
        if([[cell.currentWinningArray objectAtIndex:i*10+j] isEqualToString:@"0"])
        {
           [tempField setBackground:[UIImage imageNamed:@"blue"]];
        }
        else
        {
           [tempField setBackground:[UIImage imageNamed:@"orange"]];
        }
    }
}
return cell;
于 2013-07-14T11:28:02.543 に答える