-1

行数を入力する必要があります。私が使うとき

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  

この行は、いくつかの行にスクロールした後、同じ位置に行を再描画します。以下の画面を参照してください。
ここに画像の説明を入力してください

セルをゼロにすると、

UITableViewCell *cell = nil;  

その後は正常に動作しますが、予想外に多くのメモリが必要になります。今私の質問は、なぜそれが起こっているのかということです。

セルをゼロにすることと同じ位置で再描画することの関係は何ですか?

これは私のコードです:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    UIButton *questionButton=[UIButton buttonWithType:UIButtonTypeCustom];
    questionButton.backgroundColor=[UIColor clearColor];
    questionButton.tag=indexPath.row+1;

    [questionButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];

    UIImageView *statusImageView=[[UIImageView alloc]initWithFrame:CGRectMake(190,25,23,23)];

    NSString *statusImageName=[[NSString  alloc]init];
    statusImageName=@"Right";
    [statusImageView setImage:[UIImage imageNamed:statusImageName]];
    [questionButton addSubview:statusImageView];

    if(indexPath.row%2==0)
    {
        [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarLeft"] forState:UIControlStateNormal];
        [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarLetSelected"] forState:UIControlStateHighlighted];
        CGRect topicButtonFrame=CGRectMake(0, 10, 250, 70);
        questionButton.frame=topicButtonFrame;



        NSLog(@"Even Rows =%d",indexPath.row);

        NSString *questionLabel=[NSString stringWithFormat:@" Question %d :",indexPath.row+1];
        [questionButton setTitle:questionLabel forState:UIControlStateNormal];
        //questionButton.titleLabel.textAlignment=NSTextAlignmentLeft;

        [questionButton.titleLabel setTextAlignment:UITextAlignmentLeft];
    }
    else
    {
        [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarRight"] forState:UIControlStateNormal];
        [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarRightSelected"] forState:UIControlStateHighlighted];
        CGRect topicButtonFrame=CGRectMake(100, 10, 250, 70);
        questionButton.frame=topicButtonFrame;


        NSString *questionLabel=[NSString stringWithFormat:@"     Question %d :",indexPath.row+1];
        [questionButton setTitle:questionLabel forState:UIControlStateNormal];
        questionButton.titleLabel.textAlignment=UITextAlignmentRight;
        [cell addSubview:questionButton];

    }

    [cell addSubview:questionButton];

    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    return cell;
}
4

2 に答える 2

2

目的dequeueReusableCellWithIdentifierは、より少ないメモリを使用することです。画面が4つまたは5つのテーブルセルに収まる場合、再利用すると、テーブルに1000のエントリがある場合でも、メモリに4つまたは5つのテーブルセルを割り当てるだけで済みます。

したがって、これを行うUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];と、再利用するために古いセルが返されます。これは新しいセルインスタンスではありません。古いデータに初期化されたセルのUI要素が含まれています。再度表示するには、すべてのUI要素をリセットし、新しい値を入力する必要があります。

あなたが置くときの2番目の方法UITableViewCell *cell = nil;は再利用がありません。2番目の方法では、テーブルセルの配列を使用するよりも利点はありません。テーブルに1000個のエントリがある場合、メモリに1000個のセルが割り当てられます。これを行う場合は、それらを配列に入れ、行番号を使用して配列にインデックスを付け、セルを返します。これは、セルインスタンスを再利用していないため、メモリ使用量の急増を説明するはずです。

固定セルを備えた小さなテーブルの場合、2番目のソリューションが妥当なソリューションである可能性があります。動的または大きなテーブルの場合、再利用が最善の方法です...

更新:あなたがいくつかのコードを要求したので。また、奇数または偶数に応じて2種類のレンダリングを行っていることに注意してください。reuseしたがって、偶数の質問を表示したい場合、出てくるセルは奇妙かもしれません。その場合、セルが取得された直後に(再利用または新しく作成された)セルをリセットし、通常のロジックを通過させる必要があります...

    [questionButton setBackgroundImage:[UIImage imageNamed:@"default.png"]];
    [questionButton setTitle:@"" forState:UIControlStateNormal];
    CGRect topicButtonFrame=CGRectMake(0, 0, 250, 70);
    questionButton.frame=topicButtonFrame;
于 2013-01-07T05:28:25.660 に答える
0

問題はここにあります:

        [cell addSubview:questionButton];
    }
    [cell addSubview:questionButton];

questionButtonを2回追加しています。elseセクションの1つを削除して、試してください。

アップデート :

問題が何であるかを確認するためだけにこれを試すことができますか?

if(indexPath.row%2==0)
{
    UIButton *questionButton=[UIButton buttonWithType:UIButtonTypeCustom];
    questionButton.backgroundColor=[UIColor clearColor];
    questionButton.tag=indexPath.row+1;

    [questionButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];

    UIImageView *statusImageView=[[UIImageView alloc]initWithFrame:CGRectMake(190,25,23,23)];

    NSString *statusImageName=[[NSString  alloc]init];
    statusImageName=@"Right";
    [statusImageView setImage:[UIImage imageNamed:statusImageName]];
    [questionButton addSubview:statusImageView];
    [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarLeft"] forState:UIControlStateNormal];
    [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarLetSelected"] forState:UIControlStateHighlighted];
    CGRect topicButtonFrame=CGRectMake(0, 10, 250, 70);
    questionButton.frame=topicButtonFrame;

    NSString *questionLabel=[NSString stringWithFormat:@" Question %d :",indexPath.row+1];
    [questionButton setTitle:questionLabel forState:UIControlStateNormal];
    //questionButton.titleLabel.textAlignment=NSTextAlignmentLeft;

    [questionButton.titleLabel setTextAlignment:UITextAlignmentLeft];
    [cell addSubview:questionButton];
}
else
{
    UIButton *questionButton=[UIButton buttonWithType:UIButtonTypeCustom];
    questionButton.backgroundColor=[UIColor clearColor];
    questionButton.tag=indexPath.row+1;

    [questionButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];

    UIImageView *statusImageView=[[UIImageView alloc]initWithFrame:CGRectMake(190,25,23,23)];

    NSString *statusImageName=[[NSString  alloc]init];
    statusImageName=@"Right";
    [statusImageView setImage:[UIImage imageNamed:statusImageName]];
    [questionButton addSubview:statusImageView];
    [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarRight"] forState:UIControlStateNormal];
    [questionButton setBackgroundImage:[UIImage imageNamed:@"TopicsbarRightSelected"] forState:UIControlStateHighlighted];
    CGRect topicButtonFrame=CGRectMake(100, 10, 250, 70);
    questionButton.frame=topicButtonFrame;


    NSString *questionLabel=[NSString stringWithFormat:@"     Question %d :",indexPath.row+1];
    [questionButton setTitle:questionLabel forState:UIControlStateNormal];
    questionButton.titleLabel.textAlignment=UITextAlignmentRight;
    [cell addSubview:questionButton];

}
于 2013-01-07T05:26:21.670 に答える