我有一个表视图,当用户滚动底部时加载新行。这是代码:
@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];
}
我的问题是 - 当我加载新行时,我可以看到&#34; old&#34;细胞上的图像。这是常见的错误,但在以前的项目中,它很容易用
解决[self.myImageView cancelImageRequestOperation];
当我改变MyCell类的实现时:
-(void)prepareForReuse{
// Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.
self.dateLabel = nil;
self.titleLabel = nil;
self.myImageView = nil;
[self.myImageView cancelImageRequestOperation];
}
新图片停止加载,而不是它始终显示&#34; old&#34;图像。
答案 0 :(得分:0)
可以尝试使用以下代码..
-(void)prepareForReuse{
// Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.
self.dateLabel = nil;
self.titleLabel = nil;
[self.myImageView cancelImageRequestOperation];
self.myImageView = nil;
}