Я использую ASIHTTPRequest
для загрузки файлов. Мой заказ UITableViewCell
имеет UIProgressView
, где он показывает отслеживание всех загрузок (по одному для каждой строки). Я использую ячейки, которые я использую, и я переопределяю метод PrepareForReuse
, но я наблюдал проблему, когда я делаю прокрутку в представлении таблицы, все переходы в ячейках сбрасываются для метода PrepareforReuse
.Ящики повторного использования с progressview
Что я могу сделать для правильного отображения progressViews? Благодаря!!
DownloadViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"DownloadsCell";
DownloadCell *cell = (DownloadCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[DownloadCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if (indexPath.section == 0) {
cell.cellLabel.text = (NSString *)[names objectAtIndex:indexPath.row];
[cell.cellImageView setImage:[UIImage imageNamed:@"curso.png"] forState:UIControlStateNormal];
//cell.cellImageView.tag = indexPath.row;
ASIHTTPRequest *request;
request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[urls objectAtIndex:indexPath.row]]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[[[paths objectAtIndex:0] stringByAppendingPathComponent:@"Downloads"] stringByAppendingPathComponent:login] stringByAppendingPathComponent:[[download curso] ID]];
NSError *error;
if (![[NSFileManager defaultManager] fileExistsAtPath:path]){
if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:&error]){
NSLog(@"Create directory 5 error: %@", error);
}
}else path = [path stringByAppendingPathComponent:[names objectAtIndex:indexPath.row]];
NSString *tmpPath = [[[paths objectAtIndex:0] stringByAppendingPathComponent:@"Downloads"] stringByAppendingPathComponent:@"TMP"];
NSError *error2;
if (![[NSFileManager defaultManager] fileExistsAtPath:tmpPath]){
if (![[NSFileManager defaultManager] createDirectoryAtPath:tmpPath withIntermediateDirectories:NO attributes:nil error:&error]){
NSLog(@"Create directory TMP error: %@", error2);
}
}
[request setDownloadDestinationPath:path];
[request setTemporaryFileDownloadPath:[[tmpPath stringByAppendingPathComponent:[names objectAtIndex:indexPath.row]]stringByAppendingString:@".download"]];
[request setAllowResumeForFileDownloads:YES];
[request setDownloadProgressDelegate:cell.cellProgressView];
//[request setDelegate:self];
[request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:
[names objectAtIndex:indexPath.row], @"name",
[urls objectAtIndex:indexPath.row], @"url",
nil]];
[networkQueue addOperation:request];
NSLog(@"Downloading %d...",indexPath.row);
}
[networkQueue go];
return cell;
}
DownloadCell.m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.contentView.frame = CGRectMake(0, 0, 320, 70);
cellImageView = [[UIButton alloc] initWithFrame:CGRectMake(5, 4, 58, 52)];
[self.contentView addSubview:cellImageView];
cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 200, 30)];
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.textAlignment = NSTextAlignmentLeft;
cellLabel.textColor = [UIColor colorWithRed:1.0/255.0 green:19.0/255.0 blue:121.0/255.0 alpha:1.0];
cellLabel.font = [UIFont fontWithName:@"Gill Sans" size:13.0];
cellLabel.numberOfLines = 0;
[self.contentView addSubview:cellLabel];
cellProgressView = [[UIProgressView alloc] initWithFrame:CGRectMake(70, 40, 200, 15)];
[self.contentView addSubview:cellProgressView];
UIImageView * accesoryImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"flechaAzul.png"]];
self.accessoryView = accesoryImg;
}
return self;
}
- (void) prepareForReuse
{
self.contentView.frame = CGRectMake(0, 0, 320, 70);
self.contentView.backgroundColor = [UIColor whiteColor];
cellImageView.frame = CGRectMake(5, 4, 58, 52);
cellLabel.frame = CGRectMake(70, 10, 200, 30);
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.textAlignment = NSTextAlignmentLeft;
cellLabel.textColor = [UIColor colorWithRed:1.0/255.0 green:19.0/255.0 blue:121.0/255.0 alpha:1.0];
cellLabel.font = [UIFont fontWithName:@"Gill Sans" size:13.0];
cellLabel.numberOfLines = 0;
cellProgressView.frame = CGRectMake(70, 40, 200, 15);
UIImageView * accesoryImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"flechaAzul.png"]];
self.accessoryView = accesoryImg;
self.selectionStyle = UITableViewCellSelectionStyleBlue;
self.userInteractionEnabled = YES;
}
Нет, на самом деле ответ, но способ избежать неприятностей. Лучшая практика состоит в том, чтобы иметь один бизнес-объект для одного указательного пути и позволить ячейке обрабатывать объект, чтобы весь элемент tableView: cellForRowAtIndexPath: 'выгружал ячейку и передавал ей соответствующий бизнес-объект. Таким образом, ячейка знает предыдущие и новые бизнес-объекты, которые она должна обрабатывать, и может отключиться от первого и подключиться к последнему, а также мгновенно обновить свои подпрограммы, чтобы отразить состояние нового объекта. –
В вашем случае бизнес-объект является описанием актива и потенциально текущей операцией его загрузки. BTW 'ASIHTTPRequest' является древним, лучше использовать' AFNetworking'. Также похоже, что вы запускаете запрос каждый раз, когда строка прокручивается, но никогда не отменяет и не использует их повторно. Либо отменяйте запросы, когда ячейка повторно используется, либо повторно используете запросы на уже загруженные вами ресурсы. В противном случае некоторые быстрые прокрутки вперед и назад могут убить сеть, аккумулятор и приложение. –
Да ... с быстрой прокруткой приложения происходит сбой. Я должен получить строки кода загрузки/запроса из метода cellForRow. Я пытаюсь использовать свойство tag для определения всех индикаторов выполнения. Если он не работает, я создам массив progressViews, добавив новый столбец, когда создам новый запрос. Спасибо за ответы Вадим и Вайн !! – sumfortyone