2

请帮我写好代​​码

我的场景:从自定义图像数组加载表格视图中的图像(大小可以是 1-1000 或可能更多)- 完成
将图像放在按钮上完成(不知道正确的方法,但工作正常)
在按钮完成的帮助下获取图像标签
不要在单元格中加载额外的图像(假设一个单元格中有 4 个图像视图和 26 个图像)-完成

我正在 UItableView 中加载图像,但应用程序仅在设备中崩溃,在模拟器中工作正常。我已经用谷歌搜索并找到了一些关于重用单元格的答案,相应地修改了我的代码。但我仍然不确定该图像加载和崩溃。有时当图像较少时,它会在滚动时崩溃,有时在表格视图中加载图像后会崩溃。 我接近我的解决方案,但没有得到好的结果。请帮忙!!
请检查我的代码并根据需要进行修改

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

    NSString *CellIdentifier =[NSString stringWithFormat:@"%i-%i", indexPath.section,indexPath.row];
    //  static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell;

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
        NSInteger imageIndex = [indexPath row] * 4;
        NSInteger size = [imageArray count];

        imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 80,80)];
        imageView1.image = [imageArray objectAtIndex:imageIndex];

        aButton1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton1 setTag:imageIndex];
        [aButton1 setImage:imageView1.image forState:UIControlStateNormal];
        aButton1.frame = CGRectMake(0, 0, 80,80);

        [aButton1 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:aButton1];

        if (size == imageIndex +1) {
            return cell;
        }

        imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(80, 0, 80,80)];
        // imageView2.tag= tagValue+2000;
        imageView2.image = [imageArray objectAtIndex:imageIndex+1];
        [cell.contentView addSubview:imageView2];

        UIButton* aButton2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton2 setTag:imageIndex+1];
        [aButton2 setImage:imageView2.image forState:UIControlStateNormal];
        aButton2.frame = CGRectMake(80, 0, 80,80);
        [aButton2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:aButton2];

        if (size == imageIndex + 2) {
            return cell;
        }

        imageView3 = [[UIImageView alloc] initWithFrame:CGRectMake(160, 0, 80,80)];
        imageView3.image = [imageArray objectAtIndex:imageIndex+2];

        UIButton* aButton3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton3 setTag:imageIndex+2];
        [aButton3 setImage:imageView3.image forState:UIControlStateNormal];
        aButton3.frame = CGRectMake(160, 0, 80,80);

        [aButton3 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:aButton3];

        if (size == imageIndex + 3) {
            return cell;
        }
        imageView4 = [[UIImageView alloc] initWithFrame:CGRectMake(240, 0, 80,80)];
        imageView4.image = [imageArray objectAtIndex:imageIndex+3];

        UIButton* aButton4 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton4 setTag:imageIndex+3];
        [aButton4 setImage:imageView4.image forState:UIControlStateNormal];
        aButton4.frame = CGRectMake(240, 0, 80,80);
        [aButton4 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:aButton4];

    }

    else
    {
        NSLog(@"old one");
    }

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    return cell;
}
4

2 回答 2

4

问题在于这条线

NSString *CellIdentifier =[NSString stringWithFormat:@"%i-%i", indexPath.section,indexPath.row];

每一行都被创建,除了滚动回已经显示的单元格时,没有一个单元格被重用。

更好的方法是利用单元格的重用,方法是使用标识符在单元格消失时返回单元格,然后根据要求对其进行样式设置。更像NSString *CellIdentifier =@"MyCellIdentifier";

现在检查单元格的部分和行并相应地设置样式。

于 2013-04-26T07:03:43.440 回答
0

我认为图像的大小很重要。您可以尝试加载小于 5kb 的非常小的图像并查看(仅用于测试目的)吗?

于 2013-05-17T12:18:45.413 回答