2

当我滚动它时,我的 tableview 会滞后。我使用了自定义单元格,因为单元格中有许多内容视图。但是当我滚动表格视图时它滚动不顺畅。我没有得到我的编码中的问题,请帮助我找到问题。这是我的代码:

   static NSString *CellIdentifier = @"Cell1";
    CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
          if (cell == nil)
        {
            cell = [[[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            cell.backgroundColor=[UIColor blackColor];
            cell.frame = CGRectMake(0.0, 0.0, 320.0, 200.0);
            UITapGestureRecognizer *tap1 =
            [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlefirstTap:)];
            tap1.delegate=self;
            tap1.numberOfTapsRequired=1;
            [cell.image1 addGestureRecognizer:tap1];
            [tap1 release];

            UITapGestureRecognizer *tap2 =
            [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlesecondTap:)];
            tap2.delegate=self;
            tap2.numberOfTapsRequired=1;
            [cell.image2 addGestureRecognizer:tap2];
            [tap2 release];

        }
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        [cell.image1 setTag:indexPath.row*2];
        [cell.image2 setTag:indexPath.row*2+1];
        NSString *checkfirstcat=[[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"category"];
        NSString *checksecondcat=[[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"category"];
            for (int i = 0; i < [categories count]; i++) {
                if ([checkfirstcat isEqualToString:[categories objectAtIndex:i]]) {
                    cell.first.backgroundColor=[uniquecolors objectAtIndex:i];
                    cell.veryfirst.backgroundColor=[uniquecolors objectAtIndex:i];
                    break;
                }
            }

        for (int i = 0; i < [categories count]; i++) {
            if ([checksecondcat isEqualToString:[categories objectAtIndex:i]]) {
                cell.second.backgroundColor=[uniquecolors objectAtIndex:i];
                cell.verysecond.backgroundColor=[uniquecolors objectAtIndex:i];
                break;  
            }
        }

        cell.veryfirst.text= [NSString stringWithFormat:@"   %@",[[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"rank"]];
        cell.first.text=[NSString stringWithFormat:@" %@",[[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"category"]];
        cell.verysecond.text=[NSString stringWithFormat:@"   %@", [[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"rank"]];
        cell.second.text=[NSString stringWithFormat:@" %@",[[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"category"]];

        UIActivityIndicatorView *spinner1 =[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        spinner1.frame = CGRectMake(55, 55, 40, 40);
        [cell.contentView addSubview:spinner1];    
        [spinner1 startAnimating];

        UIActivityIndicatorView *spinner2 =   [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        spinner2.frame = CGRectMake(220, 55, 40, 40); 
        [cell.contentView addSubview:spinner2];            
        [spinner2 startAnimating];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0ul);
                dispatch_async(queue, ^{
        NSString *pathimage1 = [[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"image"];
        NSString *pathimage2 = [[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"image"];
                dispatch_sync(dispatch_get_main_queue(), ^{
        [cell.image1 setImageWithURL:[NSURL URLWithString:pathimage1] placeholderImage:[UIImage imageNamed:@"placeholder.png"] success:^(UIImage *image, BOOL cached){
                        [spinner1 stopAnimating];
                    } failure:^(NSError *error) {
                        [spinner1 stopAnimating];
                    }];

        [cell.image2 setImageWithURL:[NSURL URLWithString:pathimage2] success:^(UIImage *image, BOOL cached) {
            [spinner2 stopAnimating];
        } failure:^(NSError *error) {
            [spinner2 stopAnimating];
        }];
        });
       });

        cell.btn1.tag=indexPath.row*2;
        cell.btn2.tag=indexPath.row*2+1;

        [cell.btn1 setTitle:[[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"total_like"] forState:UIControlStateNormal];
        [cell.btn2 setTitle:[[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"total_like"] forState:UIControlStateNormal];
        NSString *btn1status=[[aroundmearray objectAtIndex:indexPath.row*2]objectForKey:@"like_stat"];
        NSString *btn2status=[[aroundmearray objectAtIndex:indexPath.row*2+1]objectForKey:@"like_stat"];

        if (![btn1status isEqualToString:@"false"]) {
            [cell.btn1 setImage:[UIImage imageNamed: @"fav-icon.png"] forState:UIControlStateNormal];
        }
        else
        {
            [cell.btn1 setImage:[UIImage imageNamed: @"fav.png"] forState:UIControlStateNormal];
        }

        if (![btn2status isEqualToString:@"false"]) {
            [cell.btn2 setImage:[UIImage imageNamed: @"fav-icon.png"] forState:UIControlStateNormal];
        }
        else
        {
            [cell.btn2 setImage:[UIImage imageNamed: @"fav.png"] forState:UIControlStateNormal];
        }
        [cell.btn1 addTarget:self action:@selector(like1:) forControlEvents:UIControlEventTouchUpInside];
        [cell.btn2 addTarget:self action:@selector(like2:) forControlEvents:UIControlEventTouchUpInside];


        }
    return cell;

}
4

2 回答 2

2

我猜你在tableView:cellForRowAtIndexPath:方法中做这一切?这通常很糟糕。特别是创建UIActivityIndicatorView视图等内容。

请记住,每次屏幕上出现一行时都会调用此方法。即使您向下滚动,然后再向上滚动。因此,将为每一行多次调用此方法。

如果要添加微调器,在 Interface Builder 中配置它会更聪明,然后只调用微调器进行动画处理。

于 2013-10-01T07:31:27.527 回答
1

正如 NSAddict 指出的那样,不建议在 tableView:cellForRowAtIndexPath 中执行所有这些操作:

此外,当您似乎只需要一次时,您正在执行 2 次迭代。

for(int i = 0; i < [categories count]; i++) {}

您似乎正在使用 SDWebImage 或某种异步图像加载器库来处理图像。如果您使用 SDWebImage,推荐的方法是根据其文档使用类别(用于 UIactivityIndi​​cator)。看到这个;https://github.com/JJSaccolo/UIActivityIndi​​cator-for-SDWebImage

于 2013-10-01T07:42:29.900 回答