UIProgressView 在我的应用程序加载其资源时没有更新

Posted

技术标签:

【中文标题】UIProgressView 在我的应用程序加载其资源时没有更新【英文标题】:UIProgressView not updating while my App loads its resources 【发布时间】:2009-08-07 02:40:22 【问题描述】:

我正在尝试在长时间的资源加载过程中更新 UIView 中的 UIProgressView 进度条。假设我正在从一个 NIB 文件(可能有一百个)加载一堆位图。加载 10 后,我向 UIProgressView 发出 .progress ,它是已显示的 UIView 的一部分。所以,我发出:

myView.myProgressView.progress=0.2;

然后,我加载另外 10 个位图,然后发出:

myView.myProgressView.progress=0.4;

等等,等等。当应用程序运行时,进度条不会前进。它只是停留在其初始位置。冒着听起来像个白痴的风险,我是否必须在单独的线程上加载我的资源,以便操作系统可以更新 UI,或者,有没有更简单的方法?感谢您的帮助。

【问题讨论】:

【参考方案1】:

是的。将它们加载到单独的线程上。或者只是使用类似performSelector:

[self performSelector:@selector(setProgressBar) withObject:nil afterDelay:0.0];

(并创建一个setProgressBar 函数,该函数从成员变量中读取当前值并更新 UI)

【讨论】:

嗨,Marcc,我尝试了您的 performSelector 方法,但无济于事。 setProgressBar 方法在我所有其他代码完成后被调用。我什至没有尝试更新 UIProgressView。我只是在 setProgressBar 中放了一个 NSLog,然后在所有其他资源加载方法之后,它就出现在了控制台上。还有其他建议吗?你能给我指一个参考,可能在另一个线程上做所有这些事情吗? 糟糕。所以这个想法是对的,你需要在一个线程上更新数据,而不是阻塞主线程(UI线程)。如果您采用这种方法,我认为您实际上需要使用 performSelectorOnMainThread(在开发人员网站中搜索有关此方法的文档)。【参考方案2】:

您可以在每次更新 UI 后运行 runloop 的一个步骤:

SInt32 result;
do 
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE);
 while(result == kCFRunLoopRunHandledSource);

它可能会产生其他不良后果(例如,使用户能够与 UI 交互,在执行之前执行视图控制器的委托,例如 viewDidAppear,等等)所以要非常非常小心。

【讨论】:

以上是关于UIProgressView 在我的应用程序加载其资源时没有更新的主要内容,如果未能解决你的问题,请参考以下文章

加载 UIWebView 时如何使用 UIProgressView?

将 UIProgressView 添加到 NSURLConnection?

UIProgressView 约束问题

UIProgressView 指示器未使用正确的“进度”更新

低于 0.1 的 UIProgressView 值未正确显示

UIProgressView 用 UIImage 自定义进度条