0

この種の質問は以前に何度も聞かれたことを知っています..しかし、私は非常に混乱しており、多くの検索を行っても解決策が見つかりません..

セルが6番目のセルごとに繰り返されるテーブルがあります..しかし、奇妙なことに、繰り返されるセルのいずれかをクリックすると、 didSelectRowAtIndexpathメソッドで表示されるはずの正しいデータが表示され ます..

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

     return  array.count;
}

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

    UIImageView * cellImageView;
    NSArray *pathComponents;
    NSData *imageData;
    UIImage *image;
    UILabel * mainLabel = nil;

    UITableViewCell *cell = nil;

    static NSString *CellIdentifier = @"Cell";

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        NSLog(@"in loop");

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];

        mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];

        [cell addSubview:mainLabel];
    }

    mainLabel.backgroundColor = [UIColor clearColor];
    mainLabel.textColor = [UIColor redColor];
    mainLabel.numberOfLines = 0;
    mainLabel.font  = [UIFont fontWithName:@"Arial-BoldMT" size:11];
    mainLabel.lineBreakMode = NSLineBreakByWordWrapping;
    mainLabel.text = [[array objectAtIndex:indexPath.row]retain];

    return cell;
}
4

3 に答える 3

4
if (cell == nil)
{

    NSLog(@"in loop");

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];


    mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];
    mainLabel.tag = 1234;

    [cell addSubview:mainLabel];
}
else {
    mainLabel = (UILabel*)[cell viewWithTag:1234];
}

しかし、リサイクル自体の問題に加えて、他にもいくつかの問題があります。最適なパフォーマンスを得るには、ラベルのすべての設定 (毎回同じ操作) をif句内で行う必要があります。if/else の後、メソッドの本体にのみ変数テキストを設定します。

さらに、ARC を使用しない場合は、addSubview 呼び出しの後、if句の終了前にラベルを解放する必要があります。

また、ラベル テキストは取得元のまま保持するべきではありませんarray。ラベルはそれを保持します。

于 2013-06-03T11:20:21.563 に答える
1

Try setting mainLabel attributes only first time.Keep your main label property settings in your condition if cell==nil

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

    UILabel *mainLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)]autorelease];
    mainLabel.tag=23;

    mainLabel.backgroundColor = [UIColor clearColor];
    mainLabel.textColor = [UIColor redColor];
    mainLabel.numberOfLines = 0;
    mainLabel.font  = [UIFont fontWithName:@"Arial-BoldMT" size:11];
    mainLabel.lineBreakMode = NSLineBreakByWordWrapping;

    [cell addSubview:mainLabel];
}

UILabel *mLabel= (UILabel*)[cell viewWithTag:23];
mLabel.text = [array objectAtIndex:indexPath.row];
于 2013-06-03T11:20:47.050 に答える
0

問題は、新しいセルが作成されたときにのみ mainLabel が初期化されることです。次のように書きます。

if (cell == nil)
{

    NSLog(@"in loop");

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];


    mainLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 220, 15)];
    mainLabel.tag = 100;

    [cell addSubview:mainLabel];
} else {
    mainLabel = [[cell viewWithTag:100] retain];
}
...
[mainLabel release];
于 2013-06-03T11:20:39.710 に答える