在UITableview中加载数据问题

时间:2010-11-16 17:42:15

标签: objective-c ios cocoa-touch

我使用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;
    }

4 个答案:

答案 0 :(得分:2)

执行所有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];
//....

答案 1 :(得分:1)

第一个单元格数据将显示在所有单元格中,因为在初始化并创建可重用单元格时,在此处填充数据,需要初始化未设置其所有值的可重用单元格,然后设置此信息对于每个细胞。也就是说,您需要为此代码的if(cell==nil)部分之外的每个特定单元格提供所需的所有信息,并依赖indexPath来了解您所在的单元格,并根据此提供不同的数据。

答案 2 :(得分:1)

当没有可用的可重用单元时,您似乎正在构建单元的子视图。问题是,当您执行使可重复使用的单元格出列时,您的代码会执行什么操作?看来你什么都不做。您应该移动任何特定于行的初始化(设置标签文本值,图像等)检查出列单元格是否为nil。通过这种方式,无论您是构建新单元格还是将先前创建的单元格出列,正确显示的数据都与正在显示的行相关。

答案 3 :(得分:0)

实际上你的代码实际上很难解码,
但首先,您声明了许多应该用于检索您声明的UIViews的标记。 不幸的是,这些都是相同的(标签)所以你可能永远不会得到你想要的。您应该在头文件中添加一些常量,如:

#define kPubLabel             100

然后使用它们。

然后你通常会在声明你的单元格填充它们之后检索它们。

与此同时,在此方法中从网址检索图片是让您的应用程序变慢的最佳方法之一,因为每次滚动时,您都必须从它来自的位置重新获取图像导致您的表视图“冻结”。

最后,根据您的代码,唯一可能改变的是您添加到框架中的imageView。您通常有一个ImageView,您可以在其中放置可能已存储/缓存的图像,但很少更改单元格的contentView。


也许你应该在覆盖UITableViewCell的类中外化你的单元格构建代码。 在单元格中的每个元素上放置不同的标记,以便在方法中检索它们 根据标签检索方法中的元素 填充并仅在您的方法中填充它们 一劳永逸地检索您的图像以进行性能改进。

我不确定这会有所帮助,但在我看来,你的代码实际上还有很多工作要做。