如何在iOS中异步添加UITableViewCell的视图?

时间:2016-10-10 11:41:28

标签: ios objective-c swift uitableview

在我的应用程序中,我有一个带有巨大UITableViewCell的UITableView。每个单元都是动态的,并在运行时创建。通过说动态而不仅仅是内容,但布局也是动态的。问题是,它需要太长时间,滚动时会出现断断续续的问题。特别是当新细胞进入屏幕时,至少有1秒钟冻结。

有没有办法改善这种表现?我查看了关于异步加载单元格的本教程:

https://blog.uship.com/shippingcode/populating-uitableviewcells-asynchronously-to-fix-uitableview-lag/

但是,本教程介绍了如何将数据异步加载到静态单元格中。我需要将动态数据加载到动态布局。

2 个答案:

答案 0 :(得分:4)

以下是我希望能帮助您的一些提示

1>>尝试通过在单元格xib中为它们提供可重用的标识符来重用您的tableview单元格(如果单元格是自定义的)。

2 - ;>检查cellForTheRowAtIndexPath方法中的循环(不要在其中执行循环)。

3>>如果要在cellForTheRowAtIndexPath方法中下载图像等数据,请确保以异步方式下载它。

4>>执行UI任务,如在主线程上的单元格中设置图像,如

[NSOperationQueue mainQueue]addOperationWithBlock:{
}];

5个;>像许多if和else语句一样,在cellForTheRowAtIndexPath方法中过度调整。 enter image description here

答案 1 :(得分:1)

在cellForRowAtIndexPath方法中尝试。我在单元格上添加了自定义视图,并在该自定义视图上添加了一个imageview。您可以添加UILabel,UIButton或任何其他内容。

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

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:nil];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIndentifier];

        cell.backgroundColor = [UIColor clearColor];
        cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    }


 UIView *cellVW ;
 UIImageView *logoImg;

cellVW = [[UIView alloc] initWithFrame:CGRectMake(10, 2, tableView.frame.size.width-20, 216)];
cellVW.backgroundColor = [UIColor clearColor];
cellVW.layer.cornerRadius = 5;
cellVW.layer.borderWidth = 1;
cellVW.layer.borderColor = [[UIColor lightGrayColor] CGColor];
[cell addSubview:cellVW];

logoImg = [[UIImageView alloc] init];
logoImg.frame = CGRectMake(10, 5, tableView.frame.size.width-20, 140);
logoImg.backgroundColor = [UIColor clearColor];
logoImg.layer.borderColor = [[UIColor lightGrayColor] CGColor];




 NSURL *imageURL = [NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg"];
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:imageURL] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {

     if(error == nil)
     {
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

         if([httpResponse statusCode] == 200)
         {
             UIImage *image = [UIImage imageWithData:data];

             logoImg.image = image;


         }
         else
         {

         }
     }
 }];



    [cellVW addSubview:logoImg];

    return cell;


 }