我正在使用xml来获取数据并将其显示在uitable中。在XML中,我有一个单独的图像标记为“链接”。我将此图像显示为单元格图像。应用程序加载时一切正常,但是当我滚动表格时,单元格中的图像会发生变化。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType=UITableViewCellAccessoryNone;
cell.selectionStyle=UITableViewCellSelectionStyleNone;
//cell. separatorStyle=UITableViewCellSeparatorStyleNone;
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(110, 10, 190, 130)];
[titleLabel setTag:2];
titleLabel.numberOfLines=7;
[titleLabel setFont:[UIFont systemFontOfSize:14]];
[titleLabel setTextColor:[UIColor blackColor]];
[titleLabel setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:titleLabel];
[titleLabel release];
imageView= [[UIImageView alloc] initWithFrame:CGRectMake(5, 20, 90, 110)];
[cell.contentView addSubview:imageView];
}
NSDictionary *appRecord = [responseArr objectAtIndex:indexPath.row];
NSString *urlLink;
urlLink=[NSString stringWithFormat:@"%@",[appRecord objectForKey:@"link"]];
NSLog(@"LINK : %@",urlLink);
if([urlLink length] ==0)
{
imageView.image=[UIImage imageNamed:@"ioffer.png"];
}
else {
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlLink]];
UIImage *image = [[UIImage alloc] initWithData:imageData];
imageView.image = image;
}
UILabel *desclbl = (UILabel*)[cell.contentView viewWithTag:2];
desclbl.text = [NSString stringWithFormat:@"%@",[appRecord objectForKey:@"description"]];
return cell;
}
我在表格的cellForRowAtIndexPath中使用了这些代码。 responseArr是我存储链接的数组。
任何人都可以帮我解决这个问题。
提前致谢 Malathi
答案 0 :(得分:0)
我有同样的问题。滚动时,单元格在其他索引处重用。 尝试在“if(cell == nil)”之外放置用数据填充单元格的代码。为我工作。
祝你好运, 亚历山大
答案 1 :(得分:0)
如果重复使用现有的表视图单元格,即代码跳过第一个if-block,则imageView
未初始化(无论如何都会声明它在哪里?)。这意味着即使您设置了新文本,也会重复使用一些随机图像。
修复方法是确保imageView
在所有情况下都是初始化的。
请在此方法中在本地声明。其他一切对我来说都很危险。
答案 2 :(得分:0)
if (cell == nil)
的“隐含的其他”是它正在重用表格缓存中的一个单元格。它没有重置任何关于那些的东西,只是拿起它们并使用它们。这意味着您在那里获得的任何元素都需要手动清除,特别是如果它们在填写之前需要一段时间。
你已经做了一些违约,在这里:
if([urlLink length] ==0)
{
imageView.image=[UIImage imageNamed:@"ioffer.png"];
}
如果你只是做那个没有条件的 - 也就是说
imageView.image=[UIImage imageNamed:@"ioffer.png"];
你会得到的是,你的单元格将加载其默认图像,然后当图像远程加载时它将替换它。
现在:你正在同步加载图片。这意味着您的整个UI将在Web请求发生时冻结。不太好。
答案 3 :(得分:0)
您也可以使用自定义单元格而不是每次单独检查 如以下示例所示 - 条件 -
if(shout.creator.avatarImage){
avatarView.image = shout.creator.avatarImage;
}
else{
FetchImageOperation *operation = [[FetchImageOperation alloc] init];
operation.delegate = self;
operation.urlString = shout.creator.avatarURL;
[operationQueue addOperation:operation];
[operation release];
}
-(void)fetchthumbImageOperation:(FetchThumbImageOperation *)operation didFetchImage:(UIImage *)image
{
avatarView.image= image;
}
Here, i check the condition for image in tableview data source.
-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}