みんな地獄:)
iOSでのUITablewViewControllerの使用経験は、残念ながら非常に限られています。アプリケーションで必要なのは、現在Webサーバーにアップロードされているアクティブなアップロード(ビデオ、オーディオなど)ごとに1つのカスタムセルを含むUIテーブルビューです。
これらの各アップロードはバックグラウンドで非同期に実行され、更新の進行状況をパーセンテージで示す、それぞれのセルのUILabelなどをすべて更新できる必要があります。
今、私はうまくいく解決策を見つけました。問題は、それが実際に安全かどうかわからないことです。私自身の結論に基づいて、私は実際にはそうではないと思います。私がしているのは、作成中のセルからUIViewの参照を取得し、それらの参照をアップロードオブジェクトに保存して、ラベルテキストなどを自分で変更できるようにすることです。
私自身の解決策
-(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;
アップロードアクティビティは、このセルに保存されているコントロールへの参照を取得し、それらを自分で更新できます。問題は、これが安全かどうかわからないことです。参照しているセルが再利用されたり、メモリから削除されたりした場合はどうなりますか?
基になるモデル(アップロードアクティビティ)を単純に更新してから、UIテーブルビューに変更されたセルを再描画させる別の方法はありますか?最終的にUITableViewCellをサブクラス化し、アップロードを継続的にチェックしてから、自分でアップロードさせることができますか?
編集
これは、アップロードアクティビティオブジェクトが参照UIコントロールを呼び出す方法です。
- (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]];
}
}
私の唯一の懸念は、これらのオブジェクトが非同期で実行されるため、ある時点でUIテーブルビューがこれらのアップロードオブジェクトが指しているセルを削除または再利用することを決定した場合はどうなるでしょうか。あまり安全ではないようです。