0

我的 tableview 包含从服务器加载的图像,这减慢了我的 tableview 滚动。下面是我的代码。任何想法,请帮助我。

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


    CustomTblViewCellFacetoface *cell = (CustomTblViewCellFacetoface *) [tableView dequeueReusableCellWithIdentifier:@"cellA"];
    if  (cell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTblViewCellFacetofaceNib" owner:Nil options:nil];

        for (id currentObject in topLevelObjects)
        {
            if  ([currentObject isKindOfClass:[UITableViewCell class]])
            {
                cell =  (CustomTblViewCellFacetoface *) currentObject;

                break;
            }
        }
    }
    // configure cell

    IStructFacetofaceRequests *objappointmentdetails  =   [M_ArrFacetofaceRequests objectAtIndex:indexPath.row];   
    cell.selectionStyle                         =   UITableViewCellSelectionStyleNone;
    cell.backgroundColor                        =   [UIColor clearColor];
    cell.m_CtrllblName.text                     =   objappointmentdetails.m_strUsername;
    cell.m_CtrllblVenue.text                     =   [NSString stringWithFormat:@"Venue : %@",objappointmentdetails.m_strVenue];
    cell.m_CtrllblDate.text                     =   [NSString stringWithFormat:@"%@ - %@",objappointmentdetails.m_strStartDate,objappointmentdetails.m_strEndDate];
    [cell.m_CtrllblName setTextColor:[UIColor colorWithRed:(113/255.f) green:(113/255.f) blue:(113/255.f) alpha:1.0f]];
    [cell.m_CtrllblVenue setTextColor:[UIColor colorWithRed:(113/255.f) green:(113/255.f) blue:(113/255.f) alpha:1.0f]];
    [cell.m_CtrllblDate setTextColor:[UIColor colorWithRed:(113/255.f) green:(113/255.f) blue:(113/255.f) alpha:1.0f]];
    cell.m_CtrllblName.font=[UIFont fontWithName:@"Arial-BoldMT" size:16];
    NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: objappointmentdetails.m_strImageurl]];

    cell.m_CtrlImgViewUser.image=[UIImage imageWithData: imageData];
    [cell.m_CtrlBtnView addTarget:self action:@selector(MoveToNextView:) forControlEvents:UIControlEventTouchUpInside];
    cell.m_CtrlBtnView.tag=indexPath.row;

    return cell;

}

这是我在索引路径的 cellfor 行中使用的代码。

4

2 回答 2

1

您可以使用UITableView延迟加载。

这是苹果 的样品

你可以在github上看到这个项目

是的,UITableView是围绕延迟加载的假设设计的。当您制作 aUITableView时,您根本不会加载任何条目。相反,您等待系统框架调用您的cellForRowAtIndexPath方法。对于需要加载的每个单元格,都会调用一次该方法,而这仅适用于当时可见的单元格。当用户滚动表格视图时,新的单元格进入视图,并且您的 cellforRowAtIndexPath 方法会为每个进入视图的新单元格再次调用。

现在这是一般原则。但是,如果您的单元格是由来自服务器的数据填充的,那么还有一些额外的注意事项。您可以将您的结构cellForRowAtIndexPath设置为尽可能懒惰,并为进入视野的每个单元格调用服务器。但是网络延迟会使用户体验非常糟糕。因此,您可以提前在数据结构中缓冲大量有价值的数据单元,而不是UITableView. 这样,当cellForRowAtIndexPath被调用时,您将能够通过从缓冲数据构造单元格来快速提供单元格的内容。究竟要缓冲多少数据取决于每个数据元素有多大,以及您的应用程序在内存分配方面还做了什么。顺便说一句,我认为在您的应用程序中缓冲 500 到 1000 个单元格的数据没有任何问题。但不要将数据缓冲与UITableView's单元格的排队和重用混为一谈。没有理由保持大量准备就绪的单元格 - 只是进入这些单元格的数据。

于 2012-11-23T12:33:24.263 回答
1

你可以通过使用异步加载来解决这个问题。请阅读本教程。

http://www.markj.net/iphone-asynchronous-table-image/

于 2012-11-23T12:34:22.387 回答