Возникли проблемы при загрузке изображений в сетку - PullRequest
2 голосов
/ 22 февраля 2011

У меня проблемы с загрузкой изображений в подходящий вид из xml-файла, у меня все загружается правильно, проблема в uitableview вместо загрузки изображений 0-9, он загружает только 0-7, затем изображения 0 и 1? Прилагается проект, любая помощь будет оценена спасибо

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

1 Ответ

2 голосов
/ 22 февраля 2011

Надеюсь, я прав.Сейчас у меня нет Mac, чтобы проверить это, но я видел некоторые ошибки в коде.

В MainViewController при повторном использовании ячейки вы просто возвращаете старую ячейку без каких-либо изменений.Я думаю, именно поэтому вы получаете 0-7, а затем снова 0-1.Скорее всего, на экране видны 7 ячеек, и когда вы начинаете прокручивать, вы просто возвращаете снятые с очереди ячейки (которые равны 0 и 1, потому что вы прокручиваете вниз, и эти ячейки находятся вне экрана).При повторном использовании ячейки следует повторно инициализировать asyncImageView с изображением для текущего индекса.Я скопирую и вставлю некоторый код, но это скорее в качестве руководства, потому что я не могу скомпилировать / протестировать его:

Кроме того, вы присоединяете один и тот же тег к нескольким asyncImageViews, которые вы создаете в одной и той же ячейке.Вы не сможете вернуть их все.Прикрепите идентификаторы, основанные на индексе или чем-то.

РЕДАКТИРОВАТЬ: Вот как я получил это работает.Тем не менее, я действительно не понимаю логику вашего кода, когда вы размещаете кнопки в ячейке.

Кроме того, все еще существует проблема с 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...