2010-11-16 49 views
0

我使用UITableView創建了一個應用程序。我解析來自URL的數據並在UITableView中列出。在UITableview中加載數據問題

但是在UITableView中,第一個數據只顯示一次又一次。

我不知道爲什麼會出現這個問題。

我的代碼如下:

-(UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    CGRect frame = CGRectMake(10.0f, 5.0, 300.0, 55); 
    valueField = [[UILabel alloc] initWithFrame:frame]; 
    [valueField setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin]; 
    valueField.tag = 111; 
    valueField.font=[UIFont fontWithName:@"Helvetica" size:16.0]; 
    valueField.textAlignment = UITextAlignmentLeft; 
    valueField.lineBreakMode=UILineBreakModeWordWrap; 
    valueField.numberOfLines = 0; 
    valueField.textColor = [UIColor whiteColor]; 
    valueField.highlightedTextColor = [UIColor whiteColor]; 
    valueField.baselineAdjustment = UIBaselineAdjustmentAlignCenters; 
    valueField.adjustsFontSizeToFitWidth = YES; 
    valueField.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
    valueField.text=[title1 objectAtIndex:count1]; 
    [cell.contentView addSubview:valueField]; 
    UIImage *favOn = [UIImage imageNamed:@""]; 
    UIImage *favOff = [UIImage imageNamed:@""];     
    titlebutton = [[UIButton alloc] initWithFrame:CGRectMake(10.0f, 15.0, 300.0, 55)]; 
    [titlebutton setTag:indexPath.row]; 
    //titlebutton.tag = 111; 
    [titlebutton setImage:favOff forState:UIControlStateNormal]; 
    [titlebutton setImage:favOn forState:UIControlStateSelected]; 
    if([self getFavState:@"111"]) 
    { 
     [titlebutton setSelected:YES]; 
    } 
    else 
    { 
     [titlebutton setSelected:NO]; 
    } 
    [titlebutton addTarget:self action:@selector(favButtonSwitch:) forControlEvents:UIControlEventTouchUpInside]; 
    [titlebutton setBackgroundColor:[UIColor clearColor]]; 
    [titlebutton setTitle:@"" forState:UIControlStateNormal]; 
    [cell.contentView addSubview:titlebutton]; 
    CGSize labelSize = [valueField.text sizeWithFont:valueField.font constrainedToSize:valueField.frame.size lineBreakMode:UILineBreakModeWordWrap]; 
    int labelHeight = labelSize.height; 
    NSLog(@"labelHeight = %d", labelHeight); 

    frame = CGRectMake(10.0f, 40.0, 300.0, 55); 
    pubField = [[UILabel alloc] initWithFrame:frame]; 
    [pubField setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin]; 
    pubField.tag = 111; 
    pubField.font=[UIFont fontWithName:@"Helvetica" size:12.0]; 
    pubField.textAlignment = UITextAlignmentLeft; 
    pubField.lineBreakMode=UILineBreakModeWordWrap; 
    pubField.numberOfLines = 0; 
    pubField.textColor = [UIColor whiteColor]; 
    pubField.highlightedTextColor = [UIColor whiteColor]; 
    pubField.baselineAdjustment = UIBaselineAdjustmentAlignCenters; 
    pubField.adjustsFontSizeToFitWidth = YES; 
    pubField.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
    pubField.text=[pubDate objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:pubField]; 

    frame = CGRectMake(5.0, 70.0, 300.0, 55); 
    desField = [[UILabel alloc] initWithFrame:frame]; 
    [desField setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin]; 
    desField.tag = 111; 
    desField.font=[UIFont fontWithName:@"Helvetica" size:13.0]; 
    desField.textAlignment = UITextAlignmentLeft; 
    desField.lineBreakMode=UILineBreakModeWordWrap; 
    desField.numberOfLines = 0; 
    desField.textColor = [UIColor whiteColor]; 
    desField.highlightedTextColor = [UIColor whiteColor]; 
    desField.baselineAdjustment = UIBaselineAdjustmentAlignCenters; 
    desField.adjustsFontSizeToFitWidth = YES; 
    desField.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
    desField.text=[description objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:desField]; 
    } 

    UIImage *patternImage = [UIImage imageNamed:@"bg.jpg"]; 
    UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
    backView.backgroundColor = [UIColor colorWithPatternImage: patternImage]; 
    cell.backgroundView = backView; 

    NSString *image1 =[images objectAtIndex:indexPath.row]; 
    NSLog(@"Images ..... = %@",image1); 
    NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[images objectAtIndex:indexPath.row]]]; 
    UIImage *myimage = [[UIImage alloc] initWithData:mydata]; 
    UIImageView *imageView = [ [ UIImageView alloc ] initWithImage: myimage ]; 
    imageView.frame = CGRectMake(10.0f, 110.0f, 120.0f, 120.0f); 
    [cell.contentView addSubview:imageView]; 
    return cell; 
    } 

回答

2

做所有的分配/ init和所有的東西,這將是相同的任意單元格中

if(cell==nil){ 
    //<-- here 
} 

而設置的文本和由具體的數據塊外改變任何事情

if(cell==nil){ 

} 
//<-- here 

即:

if(cell==nil){ 
    //.... 
    valueField.tag = 111; 
    valueField.font = [UIFont fontWithName:@ "Helvetica" size:16.0]; 
    valueField.textAlignment = UITextAlignmentLeft; 
    valueField.lineBreakMode = UILineBreakModeWordWrap; 
    valueField.numberOfLines = 0; 
    valueField.textColor = [UIColor whiteColor]; 
    valueField.highlightedTextColor = [UIColor whiteColor]; 
    valueField.baselineAdjustment = UIBaselineAdjustmentAlignCenters; 
    valueField.adjustsFontSizeToFitWidth = YES; 
    valueField.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 
    [cell.contentView addSubview : valueField]; 
    //.... 
} 
//.... 
valueField.text = [title1 objectAtIndex:count1]; 
//.... 
+0

感謝vikingosegundo。爲了您的幫助,我解決了我的問題..謝謝 – Velmurugan 2010-11-17 08:44:05

1

因爲當你初始化並創建可重複使用的電池,你填寫的數據有第一個單元格的數據是越來越顯示在所有的細胞,你需要初始化一個可重複使用沒有設置其所有值的單元格,然後爲每個單元格設置此信息。也就是說,您需要爲此代碼的if(cell==nil)部分以外的每個特定單元獲取所需的所有信息,並依靠indexPath來了解您所在的單元,並根據此信息輸入不同的數據。

1

當沒有可重用的單元格可用時,您似乎正在構造單元格的子視圖。問題是,當你的代碼出隊一個可重用的單元時,你的代碼是做什麼的?看來你什麼都不做。您應該移動任何特定於行的初始化(設置標籤文本值,圖像等)外部的檢查出列單元格是否爲nil。通過這種方式,無論您是剛構建一個新的單元格還是先前創建的單元格,都會正確顯示的數據與正在顯示的行相關聯。

0

其實你的代碼這種方式很難解碼,
但首先,你聲明瞭很多標籤,應該用來檢索你聲明的UIViews。 不幸的是這些都是一樣的(標籤),所以你可能永遠不會得到你想要的。你應該在你的頭文件中加入一些常量:

#define kPubLabel    100 

然後使用它們。

然後你通常在聲明你的單元格填充它們之後檢索這些。

與此同時,通過此方法從url中檢索圖片是讓您的應用程序變慢的最佳方式之一,因爲每次滾動時,您都必須從其來源處重新獲取圖片從導致您的表視圖「凍結」。

最後,根據你的代碼,唯一可能改變的是你添加到你的框架的imageView。您通常擁有一個ImageView,您可以在其中放置可能已存儲/緩存但很少更改單元格的contentView的圖像。

ie
也許你應該在一個類中重寫UITableViewCell的外部化單元構建代碼。 將不同的標籤放在您單元格的每個元素上,以便在您的方法中檢索它們。
根據那裏的標籤檢索你的元素在你的方法中。
填充並僅在您的方法中填充它們。
檢索您的圖像一勞永逸的表現改善。

我不確定這會有幫助,但以我的觀點來看,在您的代碼中實際上有很多工作要做。