簡體   English   中英

tableView在單元格上加載舊圖像

[英]tableView load old images on cell

我有一個表格視圖,當用戶滾動底部時會加載新行。 這是代碼:

@implementation MainViewController{

    short currentIndex;
    NSNumber *currentPage;
    MyCell *cell;
}


- (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"bam bam?");

    // Setting ivars

    currentPage = @(1);

    // Центр уведомлений. Подписываемся на уведомления чтобы знать, когда нужно обновить табличку.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadNotification:) name:@"updateTable" object:nil];

    [self loadNews];
}

-(void)reloadNotification: (NSNotification*) notification{

    NSLog(@"Recieved notify");
    [self.tableView reloadData];
}



-(void)loadNews{

    //    page=1&limit=5&order_by=created_at&order=desc

    [[MedsolutionAPI sharedInstance] getNewsWithParameters:self.parameters :^(NSMutableArray *newsArray) {

        self.dataArray = newsArray;
    }];

}


#pragma mark - table view delegate

// Метод который вызывается при нажатии на ячейку. Используем его для вызова метода performSegueWithIdentifier и сохранения текущего индекса.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    currentIndex = indexPath.row;

   // [self performSegueWithIdentifier:@"detail" sender:self];


}

// Высота ячейки

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 100;
}



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 1;
}

// Метод определяющий количество ячеек (соответствует количеству объектов массива objectsArray

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return [self.dataArray count];;
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    // Инициализация ячейки


    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    // Получаем объект по соответствующему индексу

    NewsParseer *news = [self.dataArray objectAtIndex:indexPath.row];

    // Заполняем ячейку

    cell.titleLabel.text = news.title;

    cell.dateLabel.text = news.created_at;

    // Загружаем изображение с помощью метода загрузки изображений библиотеки AFNetworking

    [cell.myImageView setImageWithURL:[NSURL URLWithString:news.standardImage]];


    return cell;
}

 // Вызывается когда пользователь скролит вниз, для подгрузки новых ячеек

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSInteger currentOffset = scrollView.contentOffset.y;
    NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    if (maximumOffset - currentOffset <= -40) {
        NSLog(@"reload");

        // Add task

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

            /* Создаем свою группу */

            dispatch_group_t myGroup = dispatch_group_create();

            /* Реализуем задачи в группе */

            dispatch_group_enter(myGroup);

            /* Имплементация */


            currentPage = [NSNumber numberWithInt:[currentPage intValue] + 1];

            [[MedsolutionAPI sharedInstance] getNewsWithParameters:self.parameters :^(NSMutableArray *newsArray) {

                    [self.dataArray addObjectsFromArray:newsArray];

            }];

            dispatch_group_leave(myGroup);

            dispatch_group_wait(myGroup, DISPATCH_TIME_FOREVER);




        });

    }
}

#pragma mark - setters & getters

-(NSDictionary*)parameters{

    return  @{@"page": currentPage, @"limit" : @"5", @"order_by" : @"created_at", @"order":@"desc" };
}

我在MyCell.m寫道:

-(void)prepareForReuse{

   [self.myImageView cancelImageRequestOperation];

}

我的問題是-當我加載新行時,在不到一秒鍾的時間內,我可以在單元格上看到“舊”圖像。 那是常見的錯誤,但是在以前的項目中,使用

[self.myImageView cancelImageRequestOperation];

當我更改MyCell類的實現時:

-(void)prepareForReuse{

    // Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.

    self.dateLabel = nil;
    self.titleLabel = nil;
    self.myImageView = nil;

    [self.myImageView cancelImageRequestOperation];

}

新圖像停止加載,而是始終顯示“舊”圖像。

可以嘗試以下代碼。

-(void)prepareForReuse{
// Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.

self.dateLabel = nil;
self.titleLabel = nil;

[self.myImageView cancelImageRequestOperation];
self.myImageView = nil;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM