Обновите UIProgressView на UITableViewCell - PullRequest
0 голосов
/ 03 июня 2011

На данный момент я получил свой основной просмотр таблицы с ячейками, которые загружаются из XML и заполняются.После этого я могу щелкнуть одну ячейку и загрузить подробный вид (файл xib, загруженный с помощью кода в основном виде таблицы).В подробном окне я могу нажать кнопку загрузки, и некоторые файлы загружаются асинхронно в папку документов.Затем я открываю представление и снова вижу свое табличное представление.

Моя идея теперь состоит в том, чтобы видеть ход загрузки в ячейке табличного представления.Я настроил uiprogressview для каждой ячейки, который по умолчанию скрыт.Теперь я хочу видеть индикатор выполнения при запуске загрузки.Как я могу это сделать?

Я пробовал что-то с executeSelectorOnMainThread и селектором, которые изменяют прогресс моей выбранной ячейки (которую я назначаю в главном табличном представлении).Кажется, это плохая идея - не сработало.

Некоторые идеи, как это сделать?


РЕДАКТИРОВАТЬ 2: Часть кода моего решения, ВНИМАНИЕ!Это не настоящий код, я удалил много строк для вставки сюда.Есть не все выпуски и т.д. Я думаю, что решение действительно грязное, но я не нашел лучшего решения для меня ...

Некоторые важные вещи:

  • cellDownloading: Массив, который знаеткаждая ячейка, которая в данный момент загружает
  • progressDictionary: знает ход каждой ячейки
  • cellDictionary: знает каждую ячейку, заполненную делегатом cellForRowAtIndexpath представления таблицы

Я также не могу скопировать весь код, потому что есть много вещей, которые не имеют ничего общего со всем процессом, но я даю вам важные шаги.Мои ячейки создаются путем анализа xml, поэтому у каждой ячейки есть setId в моем случае.

////////////////// // Downloader.mm //////////////////

метод загрузки asynchron

-(void)startAsynchronousDownload:(NSString*)path{    

// generate notification
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
NSNumber *tmpSetId = [NSNumber numberWithInteger:setId];

[userInfo setObject:tmpSetId forKey:@"setId"];

NSNotification* notification = [NSNotification notificationWithName:@"downloadStackNotification" object:self userInfo:userInfo];  
[[NSNotificationCenter defaultCenter] postNotification:notification];  

// add some infos...
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:tmpSetId forKey:@"setId"];
// perhaps more here

// asynchronous download handling
NSOperationQueue *queue = [NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImagesWithDictionary:) object:dictionary];

// release
[operation release];
[dictionary release];
[userInfo release];
}

В моем примере селектор downloadImagesWithDictionary загружает несколько изображений для каждого загруженного изображенияЯ отправляю уведомление.В моем случае каждый стек изображений имеет setId.

[...]
    NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
    NSNumber *sliceCounter = [NSNumber numberWithInt:i];
    NSNumber *amount = [NSNumber numberWithInt:amountOfImages];
    NSNumber *tmpSetId = [NSNumber numberWithInteger:setId];

    [userInfo setObject:sliceCounter forKey:@"actualImage"];
    [userInfo setObject:amount forKey:@"allImages"];
    [userInfo setObject:tmpSetId forKey:@"setId"];
    NSNotification* notification = [NSNotification notificationWithName:@"downloadSliceNotification" object:self userInfo:userInfo];  
    [[NSNotificationCenter defaultCenter] postNotification:notification ];  
[...]

////////////////////////////// //TableViewController.mm ////////////////////////////

Теперь нам нужно получить уведомления для обновления таблицы

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadSliceNotification:) name:@"downloadSliceNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadStackNotification:) name:@"downloadStackNotification" object:nil];

Нам нужен словарь ячеек, чтобы знать весь путь индекса существующих ячеек таблицы.Заполните их в cellForRowAtIndexPath делегата

[cellDictionary setObject:indexPath forKey:[NSString stringWithFormat:@"%d",cellSetId]];

Теперь мы создаем обработчик для выполнения чего-то, если мы получаем уведомление. Сначала обработчик, если загрузка начинается, у меня есть словарь прогресса, который знает каждый прогресс каждой ячейки, который я могуидентифицируйте каждую ячейку по setId - возможно, вам придется немного это изменить

- (void)downloadStackNotification:(NSNotification*)notification {  
NSDictionary *userInfo = [notification userInfo];
NSNumber *setId = [userInfo objectForKey:@"setId"];

NSNumber *progress = [NSNumber numberWithInt:0];    
[progressDictionary setObject:progress forKey:[setId stringValue]];

// add cell to downloadlist
[cellDownloading addObject:[setId stringValue]];

}

Теперь для каждого шага загрузки (в моем случае одно изображение).Рассчитайте процесс и обновите словарь, получите ячейку для обновления прогресса

- (void)downloadSliceNotification:(NSNotification*)notification {  
NSDictionary *userInfo = [notification userInfo];
NSNumber *sliceCounter = [userInfo objectForKey:@"actualImage"];
NSNumber *amount = [userInfo objectForKey:@"allImages"]; 
NSNumber *setId = [userInfo objectForKey:@"setId"]; 

NSNumber *progress = [NSNumber numberWithFloat:(100/[amount floatValue])*[sliceCounter floatValue]];      

[progressDictionary setObject:progress forKey:[setId stringValue]];
NSIndexPath* indexPath = [cellDictionary objectForKey:[setId stringValue]];

CustomServerCell* cell = (CustomServerCell*)[self.tableView cellForRowAtIndexPath:indexPath];
NSMutableDictionary *downloadData = [[NSMutableDictionary alloc] init];
[downloadData setObject:cell forKey:@"cell"];
[downloadData setObject:sliceCounter forKey:@"actualImage"];
[downloadData setObject:amount forKey:@"allImages"];

[self performSelectorOnMainThread:@selector(updateProgressWithDictionary:) withObject:downloadData waitUntilDone:NO];
} 

Обновите ячейку

-(void)updateProgressWithDictionary:(NSMutableDictionary*)downloadData {

CustomServerCell* cell = (CustomServerCell*)[downloadData objectForKey:@"cell"];
NSNumber *sliceCounter = [downloadData objectForKey:@"actualImage"];
NSNumber *amount = [downloadData objectForKey:@"allImages"];

cell.progressView.hidden = FALSE;
NSNumber *tmpProgress = [progressDictionary objectForKey:[NSString stringWithFormat:@"%d",cell.progressView.tag]];
cell.progressView.progress = [tmpProgress floatValue]/100;
cell.statusLabel.text = [NSString stringWithFormat:@"download slice %d / %d",[sliceCounter integerValue],[amount integerValue]];

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2011

Я понял проблему.Поскольку я использую табличные ячейки, которые читаются из XML через Интернет, у меня были некоторые проблемы с перезагрузкой табличного представления.Я добился успеха в следующем процессе:

  1. Создание уведомления для каждого шага загрузки (в моем случае я загружаю срез для каждого среза)
  2. Регистрация наблюдателя в основном классе просмотра таблицы
  3. Создание обработчика для уведомления
  4. Отправка информации о загрузке в виде словаря userinfo в уведомлении
  5. Сохранение прогресса каждого порядка загрузки в словаре с идентификатором в качестве ключа (в моем случае наборid)
  6. Создайте селектор, прочитайте словарь и установите процесс в правой ячейке
  7. Добавьте селектор в executeSelectorOnMainThread

Не знаю, если этохорошее решение - но оно работает для меня.

0 голосов
/ 03 июня 2011

Попробуйте использовать

[self performSelectorOnMainThread:@selector(updateProgressBar:) withObject: [NSNumber numberWithFloat:pr] waitUntilDone: YES] 

вместо

progressView.progress += 0.1; // or any other number for that matter 
...