-3

スクロールが重ならないときにtableViewCellにデータを作成する方法は?

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

    static NSString *theCell = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:theCell];

    if (! cell) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:theCell];
    }

    UILabel *data1 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"nomer"]]WithFrame:CGRectMake(10, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data1 atIndex:0];

    UILabel *data2 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"subjek"]]WithFrame:CGRectMake(50, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data2 atIndex:1];

    UILabel *data3 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"shadowScore"]]WithFrame:CGRectMake(200, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data3 atIndex:2];

    UILabel *data4 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"finalScore"]]WithFrame:CGRectMake(250, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data4 atIndex:3];

    UILabel *data5 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"kkm"]]WithFrame:CGRectMake(300, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data5 atIndex:4];

    UILabel *data6 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"Status"]]WithFrame:CGRectMake(350, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data6 atIndex:5];

    UILabel *data7 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"teachernote"]]WithFrame:CGRectMake(400, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
    [cell insertSubview:data7 atIndex:6];

    return cell;
}
4

1 に答える 1

6

問題は、セルがロードされるたびに、新しいUILabel. これは、セルが既に作成されたラベルがあり、さらに作成しているため、セルがリサイクルされるときに問題になります。

をサブクラス化し、ロード時に必要な とレイアウトをUITableViewCell作成してから、メソッドに情報を設定するだけです。これにより、セルをリサイクルしてパフォーマンスを向上させながら、レイアウトを維持し、発見したこの「スタッキングの問題」を回避できます。UILabelcellForRowAtIndexPath:

2 番目のオプション

2 つ目として、あまり望ましくないオプションは、UILabelcreate メソッドをif (!cell)ブロックに移動し、タグを使用して取得し、そのブロックの外に設定することです。これは移植性が低く、壊れやすいですが、ラベルを再利用することで同じ効率的な効果が得られます。次のようになります。

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

    static NSString *theCell = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:theCell];

    if (! cell) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:theCell];

        UILabel *data1 = [self createLabelText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"nomer"]]WithFrame:CGRectMake(10, 10, 150, 50) WithFont:[UIFont fontWithName:@"Arial" size:16] WithColor:[UIColor clearColor]];
        data1.tag = 1;
        [cell insertSubview:data1 atIndex:0];

        // ... Load Other labels and give unique tags

    }

    UILabel *data1 = [cell viewWithTag:1];
    data1 setText:[NSString stringWithFormat:@"%@",[[arrayUtama objectAtIndex:indexPath.row]objectForKey:@"nomer"]]];

    // ... Load other labels by tag and set text.

    return cell;
}
于 2013-08-26T15:00:22.503 に答える