【问题标题】:iOS Table view glitch while scrollingiOS 表格视图在滚动时出现故障
【发布时间】:2012-03-16 17:01:23
【问题描述】:

大家好,我有一个问题,每个单元格上有一个包含 4 个图像的 tableview,我需要知道单击了哪个图像,所以我将图像放在按钮上

一切正常,但它在滚动时卡住,而不是崩溃,只是卡住思考一秒钟,然后再次滚动。有人可以帮忙吗? 这是代码:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UIButton *b1, *b2, *b3, *b4;
UIImageView *lBut1,*lBut2,*lBut3,*lBut4;
if (cell == nil)        
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

b1 = [UIButton buttonWithType:UIButtonTypeCustom];
b1.frame = CGRectMake(y, y, x, x);
UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4]];
[b1 setBackgroundImage:img forState:UIControlStateNormal];
b1.tag = indexPath.row*4+1;
[b1 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
lBut1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];
lBut1.frame = CGRectMake(0, 0, x, x);
[lBut1 setAlpha:0.5];
[b1 addSubview:lBut1];
[lBut1 release];
[cell addSubview:b1];

if (indexPath.row * 4 + 1 < [dataArray count]) {
    b2 = [UIButton buttonWithType:UIButtonTypeCustom];
    b2.frame = CGRectMake(2*y+x, y, x, x);
    UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 1]];
    [b2 setBackgroundImage:img forState:UIControlStateNormal];
    b2.tag = indexPath.row*4+2;
    [b2 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];
    lBut2.frame = CGRectMake(0, 0, x, x);
    [lBut2 setAlpha:0.5];
    [b2 addSubview:lBut2];
    [lBut2 release];
    [cell addSubview:b2];
}

if (indexPath.row * 4 + 2 < [dataArray count]) {
    b3 = [UIButton buttonWithType:UIButtonTypeCustom];
    b3.frame = CGRectMake(3*y+2*x, y, x, x);
    UIImage* img = [UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 2]];
    [b3 setBackgroundImage:img forState:UIControlStateNormal];
    b3.tag = indexPath.row*4+3;
    [b3 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Defaulte.png"]];
    lBut3.frame = CGRectMake(0, 0, x, x);
    [lBut3 setAlpha:0.5];
    [b3 addSubview:lBut3];
    [lBut3 release];
    [cell addSubview:b3];
}
if (indexPath.row * 4 + 3 < [dataArray count]) {
    b4 = [UIButton buttonWithType:UIButtonTypeCustom];
    b4.frame = CGRectMake(4*y+3*x, y, x, x);
    UIImage* img =[UIImage imageWithContentsOfFile:[dataArray objectAtIndex:indexPath.row*4 + 3]];
    [b4 setBackgroundImage:img forState:UIControlStateNormal];
    b4.tag = indexPath.row*4+4;
    [b4 addTarget:self action:@selector(reportChoose:) forControlEvents:UIControlEventTouchUpInside];
    lBut4 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Defaulte.png"]];
    lBut4.frame = CGRectMake(0, 0, x, x);
    [lBut4 setAlpha:0.5];
    [b4 addSubview:lBut4];
    [lBut4 release];
    [cell addSubview:b4];
}

return cell;

}

【问题讨论】:

  • 这张表每行包含 4 张图片,我需要知道点击了哪张图片,这就是我为每个按钮使用不同标签的原因。

标签: iphone ios uitableview scroll


【解决方案1】:

单元格应重复使用。
当单元格滚动时,您会添加越来越多的按钮。分配和添加视图作为子视图需要时间。
当您滚动足够长的时间时,您将耗尽内存。

使用这样的模式:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UIButton *button;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.tag = 1001;
        // configure button properties that never change between rows
        button.frame = ...

        [cell.contentView addSubview:button];
    }
    UIImage *myImage = ...

    button = (UIButton *)[cell.contentView viewWithTag:1001];
    // configure properties that are different for each row
    [button setBackgroundImage:myImage forState:UIControlStateNormal];
    return cell;
}

仅在if (cell == nil) 中添加子视图。在该条件之外配置它们。

或者创建一个 UITableViewCell 子类来保存你的按钮。

【讨论】:

  • 但是如果我想找到点击了哪个按钮?
【解决方案2】:

这是一个很常见的问题。我应该告诉的两点:

1) 重用 tableView 单元格。 (UITableView 很常见的方法) 2)缓存尽可能多的数据。缓存虽然会增加内存占用,但也会改善滚动。尽管必须通过适当的测试来确定缓存级别(为此使用工具)。

【讨论】:

    【解决方案3】:

    最好的方法是创建一个 CUstom TableViewCell 以使您的工作更轻松。

    您可以在自定义 tableviewcell 类中编写选择器。

    http://www.galloway.me.uk/tutorials/custom-uitableviewcell/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2019-07-05
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多