我正在使用此代码:
NSURLConnection *oConnection=[[NSURLConnection alloc] initWithRequest:oRequest delegate:self];
下载文件,我想更新我加载的子视图上的进度条。为此,我使用此代码:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[oReceivedData appendData:data];
float n = oReceivedData.length;
float d = self.iTotalSize;
NSNumber *oNum = [NSNumber numberWithFloat:n/d];
self.oDPVC.oProgress.progress = [oNum floatValue];
}
子视图是oDPVC,其上的进度条是oProgress。设置progress属性不会更新控件。
根据我在网上看到的内容,很多人都希望这样做,但却没有一个完整,可靠的样本。此外,还有很多相互矛盾的建议。有些人认为你不需要一个单独的线程。有人说你需要一个后台线程来进行进度更新。有人说不,在后台做其他事情并更新主线程的进度。
我已经尝试了所有建议,但没有一个适合我。
还有一件事,也许这是一个线索。我在applicationDidFinishLaunching期间使用此代码加载子视图:
self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
[window addSubview:self.oDPVC.view];
在XIB文件中(我在Interface Builder和文本编辑器中都检查过),进度条宽度为280像素。但是当视图打开时,它已经以某种方式调整到可能宽度的一半。此外,视图的背景图像是default.png。它不会显示在默认图像的顶部,而是向上移动大约10个像素,在屏幕底部留下一个白色条。
也许这是一个单独的问题,也许不是。
答案 0 :(得分:3)
self.oDPVC.oProgress.progress = [oNum floatValue];
设置progress属性不会 更新控件。
self.oDPVC
(是nil
)的价值是多少?
self.oDPVC.oProgress
(是nil
)的价值是多少?
其他几点。
首先:
self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController"bundle:nil];
您的oDPVC
@property
如何定义?如果它使用retain
,此行可能(将)稍后导致内存泄漏(它将是retain
- ed的两倍。您应该使用此模式:
DownloadProgressViewController* dpvc = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
self.oDPVC = dpvc;
[dpvc release];
第二
float n = oReceivedData.length;
float d = self.iTotalSize;
NSNumber *oNum = [NSNumber numberWithFloat:n/d];
self.oDPVC.oProgress.progress = [oNum floatValue];
progress
属性本身就是一个浮点数。您实际上不需要使用NSNumber
对象。您还可以考虑在分母中添加一个以避免被零除:
float n = oReceivedData.length;
float d = self.iTotalSize;
float percentCompleted = n/(d + 1.0f);
self.oDPVC.oProgress.progress = percentCompleted;