使用上传状态更新UI表格视图单元格 - iOS

时间:2012-02-16 18:18:55

标签: ios uitableview editing updating

地狱大家:)

我在iOS中使用UITablewView控制器的经验非常有限。我的应用程序需要的是一个UI表视图,其中包含一个自定义单元格,用于当前上传到网络服务器的每个活动上传(视频,音频等)。

这些上传中的每一个都在背景中异步运行,并且应该能够更新各自单元格中的UILabel等内容,以便以百分比等方式说明更新进度。

现在我找到了一个有效的解决方案。问题是我不知道它是否真的安全。基于我自己的结论,我并不认为它是。我所做的只是从正在创建的单元格中检索UIViews的引用,然后将这些引用存储在上传对象中,这样它们就可以更改标签文本等等。

我自己的解决方案

-(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表视图决定删除或重用这些上载对象指向的单元格会怎样?它看起来似乎不太安全。

1 个答案:

答案 0 :(得分:2)

假设您有一个后台进程正在上传,有两种可能性:

  1. tableview是一个委托,并实现了一些uploadProgress 功能
  2. tableview侦听uploadProgress NSNotifications
  3. 第二个更容易实现,只需将侦听器启动/停止在viewdidappear / viewdiddissappear中。然后,在上传中,您可以跟踪进度并发出附加userinfo的通知,该通知会提供一个整数值来进行。该表具有处理此接收通知并重新绘制单元格的功能。 Here is how to add data to the userinfo part of an NSNotification

    如果你想成为更高级的人,你可以拥有一个上传ID并将其映射到一个单元格索引,并只重绘该特定单元格。 Here's a question and answers that explain how to do this.


    令人厌恶的伪代码因为我现在无法访问我的IOS dev env

    上传功能:

    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
    }