我无法将图像从xml文件加载到一个合适的视图中,我已正确加载所有内容,问题出在uitableview而不是加载图像0-9它只加载0-7然后图像0和1? 附件是项目,任何帮助将不胜感激 感谢
答案 0 :(得分:2)
我希望我是对的。我现在没有测试它的mac,但我在代码中看到了一些错误。
在MainViewController中重用单元格时,只需返回旧单元格而不做任何更改。 我想这就是为什么你再次获得0-7然后0-1。最有可能在屏幕上可以看到7个单元格,当你开始滚动时,你只需返回出列的单元格(因为你向下滚动并且那些单元格不在屏幕上,所以它们是0和1)。 重用单元格时,应该使用当前索引的图像重新初始化asyncImageView。我将复制粘贴一些代码,但这更像是一个指导原则,因为我无法编译/测试它:
此外,您将相同的标记附加到您在同一单元格中创建的多个asyncImageViews。你将无法取回所有这些。根据索引或其他东西附加ID。
修改强> 这就是我如何运作的方式。但是,我真的不明白你在代码中安排按钮的逻辑错误。
此外,AsyncImageView仍然存在问题。当它正在加载新图像时,它正在显示旧图像 - 这就是为什么当您滚动旧图像时首先显示活动指示符,然后出现新图像的原因。你应该有一个AsyncImageView的加载状态,它显示一些中性的东西。
另外,我对标记方法非常满意,但它有效:) 好的,足够的谈话,这是我改变的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
AsyncImageView *asyncImageView = nil;
int section = indexPath.section;
NSMutableArray *sectionItems = [sections objectAtIndex:section];
int n = ([sectionItems count]) ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
// Create a new cell
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int i=0;
int f=0;
while (i < [sectionItems count])
{
int yy = 4 +f*74;
//number of items per section 2
for(int j=0; j<[sectionItems count]; j++)
{
Item *item = [sectionItems objectAtIndex:j];
int buttonX = 10;
if (j != 0)
buttonX = 203;
NSLog(@"+++++++++++++++++++++++++++++++");
NSLog(@"image :: %d :: %@", j, item.image);
NSLog(@"+++++++++++++++++++++++++++++++");
CGRect frame;
frame.origin.x = buttonX;
frame.origin.y = yy;
frame.size.width = 107;
frame.size.height = 107;
asyncImageView = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];
asyncImageView.backgroundColor = [UIColor clearColor];
asyncImageView.tag = ASYNC_IMAGE_TAG + f * 100 + j;
//asyncImageView.opaque = YES;
[cell.contentView addSubview:asyncImageView];
i++;
}
f = f+1;
}
}
else
{
NSLog(@"cell != nill %@", cell);
}
int i=0;
int f=0;
while (i < [sectionItems count])
{
//number of items per section 2
for(int j=0; j<[sectionItems count]; j++)
{
Item *item = [sectionItems objectAtIndex:j];
asyncImageView = (AsyncImageView *) [cell.contentView viewWithTag:ASYNC_IMAGE_TAG + f * 100 + j];
[asyncImageView loadImageFromURL:[NSURL URLWithString:item.image]];
i++;
}
f = f+1;
}
return cell;
}
EDIT2 :我快速修复了AsyncImageView,以便在加载新图像时删除旧图像。我将发布一些代码摘录:
-(void)loadImageFromURL:(NSURL*)url {
// ADD THE FOLLOWING LINES
// Remove the old image (tagged with 1234)
[[self viewWithTag:1234] removeFromSuperview];
// END ADD
if (connection != nil) {
NSLog(@"connection != nil");
[connection cancel];
[connection release];
在同一方法中稍微低一点,从缓存中创建图像,添加以下行:
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// ADD THE NEXT LINE
imageView.tag = 1234; // add this line
// END ADD
[self addSubview:imageView];
在您创建新图片的另一个函数- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
中,只需再次添加标记:
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// ADD THE NEXT LINE
imageView.tag = 1234;
// END ADD
[self addSubview:imageView];
imageView.frame = self.bounds;