Каждый раз, когда я вызываю
reloadRowsAtIndexPaths
Мой UITableView contentOffset удаляется, есть ли метод делегата, который я могу использовать, чтобы отследить обновление представления таблицы и снова установить смещение, чтобы оно оставалось на месте и не анимировалосьили просто запретить это делать?
Я устанавливаю contentOffest в viewDidLoad:
self.tableView.contentOffset = CGPointMake(0, 43);
Вот пример использования:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[params valueForKey:@"index"], nil] withRowAnimation:UITableViewRowAnimationFade];
, который удаляетcontentOffset и анимирует его в поле зрения, что мне не нужно.
Более конкретно, это происходит, когда перезагружаемая строка находится в indexPath.section 0 и indexPath.row 0, то есть в верхней строке.
Дополнительная информация
Я вызываю reloadRowsAtIndexPaths после асинхронного запроса на получение изображения с сервера.В основном это работает так:
- Вызывается cellForRowAtIndexPath, который проверяет наличие файла большого пальца на диске, если файл отсутствует, вместо него загружается заполнитель и запускается асинхронный запрос.в фоновом потоке для извлечения изображения.
- Когда загрузка изображения завершится, я вызываю
reloadRowsAtIndexPaths
для правильной ячейки, так что вместо изображения-заполнителя появляется правильное изображение. - Количество ячеек может отличаться, так как запрос вызывается внутри cellForRowAtIndexPath, поэтому изображения загружаются при загрузке ячеек
Проверка файла cellForRowAtIndexPath
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_small.gif",[[listItems objectAtIndex:indexPath.row] valueForKey:@"slug"]]];
if([[NSFileManager defaultManager] fileExistsAtPath:path]){
listCell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:path]];
} else {
listCell.imageView.image = [UIImage imageNamed:@"small_placeholder.gif"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[[[listItems objectAtIndex:indexPath.row] valueForKey:@"image"] valueForKey:@"small"],@"image",[NSString stringWithFormat:@"%@_small.gif",[[listItems objectAtIndex:indexPath.row] valueForKey:@"slug"]], @"name",indexPath,@"index",@"listFileComplete",@"notification",nil];
[NSThread detachNewThreadSelector:@selector(loadImages:) toTarget:self withObject:params];
[params release];
}
Уведомление о загрузке файла:
-(void)fileComplete:(NSNotification *)notification {
[self performSelectorOnMainThread:@selector(reloadMainThread:) withObject:[notification userInfo] waitUntilDone:NO];
}
Перезагрузка ячейки (у меня жестко закодированные разделы из-за ошибки, при которой странные номера разделов пропускаются очень редко, вызывая сбой:
-(void)reloadMainThread:(NSDictionary *)params {
NSIndexPath *index;
switch ([[params valueForKey:@"index"] section]) {
case 0:
index = [NSIndexPath indexPathForRow:[[params valueForKey:@"index"] row] inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[params valueForKey:@"index"], nil] withRowAnimation:UITableViewRowAnimationNone];
break;
default:
index = [NSIndexPath indexPathForRow:[[params valueForKey:@"index"] row] inSection:2];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:index,nil] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}