2013-10-01 3 views
0

Я использую 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; 
} 
+0

Нет, на самом деле ответ, но способ избежать неприятностей. Лучшая практика состоит в том, чтобы иметь один бизнес-объект для одного указательного пути и позволить ячейке обрабатывать объект, чтобы весь элемент tableView: cellForRowAtIndexPath: 'выгружал ячейку и передавал ей соответствующий бизнес-объект. Таким образом, ячейка знает предыдущие и новые бизнес-объекты, которые она должна обрабатывать, и может отключиться от первого и подключиться к последнему, а также мгновенно обновить свои подпрограммы, чтобы отразить состояние нового объекта. –

+0

В вашем случае бизнес-объект является описанием актива и потенциально текущей операцией его загрузки. BTW 'ASIHTTPRequest' является древним, лучше использовать' AFNetworking'. Также похоже, что вы запускаете запрос каждый раз, когда строка прокручивается, но никогда не отменяет и не использует их повторно. Либо отменяйте запросы, когда ячейка повторно используется, либо повторно используете запросы на уже загруженные вами ресурсы. В противном случае некоторые быстрые прокрутки вперед и назад могут убить сеть, аккумулятор и приложение. –

+0

Да ... с быстрой прокруткой приложения происходит сбой. Я должен получить строки кода загрузки/запроса из метода cellForRow. Я пытаюсь использовать свойство tag для определения всех индикаторов выполнения. Если он не работает, я создам массив progressViews, добавив новый столбец, когда создам новый запрос. Спасибо за ответы Вадим и Вайн !! – sumfortyone

ответ

0

При вызове [request setDownloadProgressDelegate:cell.cellProgressView];request должен быть немедленно обновить делегата с текущим прогрессом. Если он ждет, пока прогресс не изменится до отправки какого-либо обновления, вы увидите пустые значения прогресса до тех пор, пока это не произойдет.

Смежные вопросы