我使用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;
}
答案 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的类中外化你的单元格构建代码。
在单元格中的每个元素上放置不同的标记,以便在方法中检索它们
根据标签检索方法中的元素
填充并仅在您的方法中填充它们
一劳永逸地检索您的图像以进行性能改进。
我不确定这会有所帮助,但在我看来,你的代码实际上还有很多工作要做。