2012-02-16 4 views
1

Ад всем :)обновление ячейки таблицы UI вида со статусом загрузки - IOS

Моего опыта работы с контроллером UITablewView в прошивке, к сожалению, весьма ограничен. Что мне нужно в моем приложении, это представление таблицы пользовательского интерфейса, которое содержит одну настраиваемую ячейку для каждой активной загрузки, загружаемой в настоящее время на веб-сервер (видео, аудио и т. Д.).

Каждый из этих загрузки запустить asynchrounously в фоновом режиме, и все должны иметь возможность обновлять такие вещи, как UILabels в своих клетках говорят что-то о процессе обновления в процентах и ​​т.д.

Теперь я нашел решение который работает. Проблема в том, что я не знаю, действительно ли это безопасно или нет. Исходя из собственного вывода, я действительно не думаю, что это так. Я просто хочу получить ссылку на UIViews из создаваемой ячейки, а затем сохранить эти ссылки в загружаемых объектах, чтобы они могли изменять текст ярлыков и так далее.

My Own Решение

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CustomCellIdentifier = @"CustomCell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; 

if (cell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil]; 

    if ([nib count] > 0) 
    { 
     cell = customCell; 
    } 
    else 
    { 
     NSLog(@"Failed to load CustomCell nib file!"); 
    } 
} 

NSUInteger row = [indexPath row]; 
UploadActivity *tempActivity = [[[ApplicationActivities getSharedActivities] getActiveUploads] objectAtIndex:row]; 

UILabel *cellTitleLabel = (UILabel*)[cell viewWithTag:titleTag]; 
cellTitleLabel.text = tempActivity.title; 

UIProgressView *progressbar = (UIProgressView*)[cell viewWithTag:progressBarTag]; 
[progressbar setProgress:(tempActivity.percentageDone/100) animated:YES]; 

UILabel *cellStatusLabel = (UILabel*)[cell viewWithTag:percentageTag]; 

[cellStatusLabel setText:[NSString stringWithFormat:@"Uploader - %.f%% (%.01fMB ud af %.01fMB)", tempActivity.percentageDone, tempActivity.totalMBUploaded, tempActivity.totalMBToUpload]]; 

tempActivity.referencingProgressBar = progressbar; 
tempActivity.referencingStatusTextLabel = cellStatusLabel; 

return cell; 
} 

Как вы можете видеть, это то, где я думаю, что я делаю то, что не вполне достаточно: tempActivity.referencingProgressBar = ProgressBar; tempActivity.referencingStatusTextLabel = cellStatusLabel;

Действия по загрузке получают ссылку на элементы управления, хранящиеся в этой ячейке, и затем могут сами их обновлять. Проблема в том, что я не знаю, безопасно это или нет. Что делать, если ячейка, на которую они ссылаются, повторно используется или удаляется из памяти и т. Д.?

Есть ли другой способ, с помощью которого можно просто обновить базовую модель (мои действия по загрузке), а затем заставить представление таблицы пользовательского интерфейса перерисовать измененные ячейки? Не могли бы вы в конечном итоге подклассифицировать UITableViewCell и позволить им постоянно проверять загрузку, а затем заставить их загружать себя?

EDIT

Это как объекты деятельности загрузки называет их ссылающихся интерфейс управления:

- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten 
totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 
{ 
if (referencingProgressBar != nil) 
{ 
    [referencingProgressBar setProgress:(percentageDone/100) animated:YES]; 
} 

if (referencingStatusTextLabel != nil) 
{ 
    [referencingStatusTextLabel setText:[NSString stringWithFormat:@"Uploader - %.f%% (%.01fMB ud af %.01fMB)", percentageDone, totalMBUploaded, totalMBToUpload]]; 
} 
} 

Моя единственная забота в том, что, так как эти объекты запустить asynchrounously, что, если в какой-то данный момент Представление таблицы пользовательского интерфейса решает удалить или повторно использовать ячейки, на которые указывают эти объекты загрузки? Это совсем не очень безопасно.

+0

Привет ~ Я хочу использовать «ApplicationActivities». Но я не знаю, что я добавляю в рамки. Пожалуйста, расскажите мне об этом. : -0 Спасибо! – hyekyung

+0

ApplicationActivities - это мой собственный пользовательский класс как часть проекта :) Это не из какой-либо внешней структуры. – CodingBeagle

ответ

2

Есть две возможности, если у вас есть фоновый процесс, который при загрузке:

  1. TableView является делегатом и реализует некоторые uploadProgress функцию
  2. TableView прослушивает uploadProgress NSNotifications

Второе проще реализовать, просто запустите слушатели, чтобы начать/остановить в viewdidappear/viewdiddissappear. Затем в вашей загрузке вы можете отслеживать прогресс и выдавать уведомление с прикрепленным пользователем, которое дает целочисленное значение для продвижения. В таблице есть функция, которая обрабатывает полученное уведомление и перерисовывает ячейки. Here is how to add data to the userinfo part of an NSNotification.

Если вы хотите быть более привлекательным, у вас может быть идентификатор загрузки и сопоставить его с индексом ячейки и только перерисовать эту конкретную ячейку. Here's a question and answers that explain how to do this.


Отвратительно ПСЕВДОКОД Поскольку у меня нет доступа к моей IOS Dev окр прямо сейчас

функция загрузки:

uploadedStuff{ 
    upload_id = ... // unique i, maps to row in table somehow 
    byteswritten = ... 
    bytestotal = .... 
    userinfo = new dict 
    userinfo["rowid] = upload_id 
    userinfo["progress"] = (int)byteswritten/bytestotal 
    sendNotification("uploadprogress",userinfo) 
} 

tableview.m:

viewdidappear{ 
    listenForNotification name:"uploadprogress" handledBy:HandleUploadProgress 
} 

viewdiddisappear{ 
    stoplisteningForNotification name:"uploadprogess" 
} 

HandleUploadProgess:NSNotification notification { 
userinfo = [notification userinfo] 
rowId = [userinfo getkey:"rowId"] 
progress = [userinfo getkey:"rowId"] 
// update row per the link above 
} 
+0

hmmmm похоже, что это может быть возможным решением. Как именно вы обновляете информацию в одной конкретной ячейке, а затем повторно рисуете ее? Я думаю, что это тоже точка, где я не совсем уверен, как наилучшим образом справиться с этим. Я также обновил свой пост с дополнительной информацией о том, как эти объекты загрузки называют свои контрольные элементы интерфейса. – CodingBeagle

+0

Я добавил ссылку на объяснение того, как перерисовывать отдельные строки. То, что вам нужно сделать в вашей таблице, - это словарь того, что карты загружаются в индекс строки таблицы. Я предполагаю, что у каждой из ваших загрузок есть уникальный идентификатор или имя, поэтому я бы использовал это. Затем в вашей функции загрузки вы хотите отправить NSNotification с помощью словаря userinfo, содержащего две части информации, загрузку уникального идентификатора и процент прогресса. Это уведомление обрабатывается функцией, которая распаковывает данные пользовательской информации уведомления, а затем загружает эту определенную строку. – nflacco

+0

Ага, похоже, это может работать очень хорошо :) Большое спасибо за помощь! Я попробую. – CodingBeagle