无法将图像加载到网格中

时间:2011-02-22 05:54:10

标签: iphone objective-c image uitableview

我无法将图像从xml文件加载到一个合适的视图中,我已正确加载所有内容,问题出在uitableview而不是加载图像0-9它只加载0-7然后图像0和1? 附件是项目,任何帮助将不胜感激 感谢

http://jptarry.com/iPhoneTest/iphoneGrid.zip

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;