2011-12-14 93 views
0

我正在加載我的表從一個XML提要到一個數組,然後創建單元格,如下面的代碼顯示。有時加載時可能非常不穩定。我認爲這只是圖片下載時我滾動,但我刪除了他們測試,有時它仍然生澀。無法弄清楚我做錯了什麼!iPhone UITableView生澀時滾動

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

    const NSInteger BOTTOM_LABEL_TAG = 1002; 
    const NSInteger TEXT_FIELD_TAG = 1003; 

    UILabel *Labelcompanyname; 
    UILabel *Labeldistance; 

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 

     cell = 
     [[[UITableViewCell alloc] 
      initWithStyle:UITableViewCellStyleDefault 
      reuseIdentifier:CellIdentifier] 
     autorelease]; 


     const CGFloat LABEL_HEIGHT = 15; 


     int spaceSize; 

     if(currentType == @"categorySearch"){ 

       spaceSize = 57; 
     } 
     else { 

       spaceSize = 34; 
     } 


     Labelcompanyname = 
     [[[UILabel alloc] 
      initWithFrame: 
      CGRectMake(
        spaceSize + 2.0 * cell.indentationWidth, 
        0.5 * (tableView.rowHeight - 2 * LABEL_HEIGHT)+10, 
        tableView.bounds.size.width - 
        spaceSize - 20.0, 
        LABEL_HEIGHT)] 
     autorelease]; 
     [cell.contentView addSubview:Labelcompanyname]; 


     Labeldistance =[[[UILabel alloc] 
         initWithFrame: 
         CGRectMake(
            spaceSize + 2.0 * cell.indentationWidth, 
            0.5 * (tableView.rowHeight - 2 * LABEL_HEIGHT)+40, 
            tableView.bounds.size.width - 
            spaceSize - 20.0, 
            LABEL_HEIGHT)] 
         autorelease]; 
     if(currentType == @"categorySearch") { 
      [cell.contentView addSubview:Labeldistance]; 

     } 


     Labelcompanyname.tag = BOTTOM_LABEL_TAG; 
     Labelcompanyname.font = [UIFont systemFontOfSize:[UIFont labelFontSize] - 2]; 

     Labeldistance.tag = TEXT_FIELD_TAG; 
     Labeldistance.font = [UIFont systemFontOfSize:[UIFont labelFontSize] - 2]; 

     cell.backgroundView = [[[UIImageView alloc] init] autorelease]; 
     cell.selectedBackgroundView = [[[UIImageView alloc] init] autorelease]; 
     cell.textLabel.numberOfLines=0; 

    } 
    else 
    { 
     Labelcompanyname = (UILabel *)[cell viewWithTag:BOTTOM_LABEL_TAG]; 
     Labeldistance = (UILabel *)[cell viewWithTag:TEXT_FIELD_TAG]; 

    } 

    PromotionObject *newObj1; 
    newObj1=[totalArray objectAtIndex:indexPath.row]; 

    if(!newObj1.furtherURL){ 

     Labelcompanyname.text =[NSString stringWithFormat:@"%@", newObj1.companyname]; 
     Labeldistance.text =newObj1.distance; 
    } 
    else 
    { 
     Labelcompanyname.text =[NSString stringWithFormat:@"Load more results"]; 
     Labeldistance.text [email protected]""; 
    } 



    NSURL *Imageurl = [NSURL URLWithString:[NSString stringWithFormat:@"%@", newObj1.locImage]]; 
    NSData *data = [NSData dataWithContentsOfURL:Imageurl]; 
    UIImage *img = [[[UIImage alloc] initWithData:data] autorelease]; 

    if(currentType == @"categorySearch"){ 

     cell.imageView.image = img; 

    } else if(currentType == @"fullSearch") { 

     cell.imageView.image = [UIImage imageNamed:@"newmap.png"]; 

    } else { 

     cell.imageView.image = [UIImage imageNamed:@"business.png"]; 

    } 


    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
} 

任何幫助將是非常讚賞

湯姆

回答

3

你絕對不應該做任何塊顯著時間UI線程同時加載細胞。例如。 NSData *data = [NSData dataWithContentsOfURL:Imageurl];

我建議在後臺將圖像加載到數據源中,並在數據下載完成後重新加載/更新表格/單元格。對你的圖像實現一個緩存也是很好的,所以你不必在每次加載單元格時再次下載它們。

如果您需要異步映像加載幫助,請搜索該文件。很多東西在SO上。

+1

如果您使用http://afnetworking.org的imageView類別,它會爲您處理所有這些 – adamweeks

+0

感謝您的支持,我會着重考慮它 – TMB87

+0

+1 afnetworking.org看起來很不錯,而且會非常有用。 –

1

我想你自己得到了答案。您的圖片加載會阻止您的用戶界面完成當前的單元格請求。 tableView:cellForRowAtIndexPath:只有在獲取圖像後才能返回。我建議你用活動指示符來替換你的圖像,並開始在後臺取回你的圖像。您可能想看看Concurrency Programming Guide