簡體   English   中英

在UITableview中加載數據問題

[英]Loading data issue in UITableview

我使用UITableView創建了一個應用程序。 我從URL解析數據,並在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;
    }

完成所有的alloc / 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];
//....

第一個單元格數據將顯示在所有單元格中,因為在初始化並創建可重用單元格時,您在其中填充數據,需要初始化一個未設置所有值的可重用單元格,然后為每個單元格設置此信息。 也就是說,您需要在該代碼的if(cell==nil)部分之外獲取每個特定單元格所需的所有信息,並依靠indexPath知道您所在的單元格,並根據這個。

沒有可重用的單元格時,您似乎正在正確地構建單元格的子視圖。 現在的問題是,什么是你的代碼做的時候出列,可重復使用的電池? 看來您什么也沒做。 你應該將任何行特有的初始化檢查 (設置標簽文本值,圖像等)對取出的細胞是否是nil 這樣,無論您是剛剛構造一個新的單元格,還是使先前創建的單元格出隊,所顯示的數據都將與所顯示的行正確關聯。

好吧,這種方式的代碼很難解碼,
但首先,您聲明了很多標記,這些標記應用於檢索您聲明的UIView。 不幸的是,這些都是相同的(標記),因此您可能永遠也無法獲得想要的東西。 您可能應該在頭文件中放入一些常量,例如:

#define kPubLabel             100

然后使用它們。

那么您通常在聲明要填充的單元格后檢索它們。

同時,以這種方法從url檢索圖像是使應用程序運行緩慢的最佳方法之一,因為每次滾動時,都必須從導致表的位置重新獲取圖像查看“凍結”。

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


也許您應該在覆蓋UITableViewCell的類中外部化單元格構建代碼。 在單元格中的每個元素上放置不同的標簽,以在方法中檢索它們。
根據那里的標簽在您的方法中檢索您的元素。
填充並且僅在您的方法中填充它們。
一勞永逸地檢索您的圖像,以提高性能。

我不確定這是否會有所幫助,但是按照我的觀點,您的代碼實際上要做很多工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM