UIProgressView不会在循环中更新

时间:2011-11-13 14:34:40

标签: objective-c uiprogressview

我正在加载一个文件,并希望在UIProgressView中显示进度。我可以设置初始值:

[loadingProgressView setProgress: 0.00];

..在viewDidLoad中,这非常有效。

我唯一要做的就是每个循环向条形图添加0.1,但不会更新:

 while (eOF != 99999) {

    ...

    [loadingProgressView setProgress:loadingProgressView.progress + 0.10];

 }

我已经检查过,但每次循环时都没有真正找到任何更新栏。

任何可以就此分享一些建议的人吗?

--- --- UPDATE

尝试了这个没有成功:

while (eOF != 99999) {

    ...

    [loadingProgressView setProgress:loadingProgressView.progress + 0.10];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

 }

5 个答案:

答案 0 :(得分:11)

您正在循环阻塞主线程的while循环,在主线程可用之前,UI元素将无法刷新。解决此问题的最佳方法是在后台线程中运行此代码(在主线程上进行UI调用)。

或者(我不确定这个,见this discussion)你通过调用

让主线有一些喘息的空间
NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]];
[[NSRunLoop currentRunLoop] runUntilDate:futureDate];

答案 1 :(得分:4)

UI作为运行循环的一部分进行更新,在此循环期间不会发生。你可以通过调用它来运行它:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];

这会强制循环更新UI等。

答案 2 :(得分:4)

我的最终解决方案

首先,如果这是关闭此线程的错误方法,我会道歉!

经过大量的测试和调查后,我终于按照以下方式显示了我的UIProgressView:

while (eOF != 99999) {

    ...

    [NSThread sleepForTimeInterval: 0.01];
    [self performSelectorOnMainThread: @selector(makeMyProgressBarMoving) withObject: nil waitUntilDone: NO];

 }



-(void)makeMyProgressBarMoving {
    float actual = [loadingProgressView progress];
    loadingProgressView.progress = actual + receivedData;
} 

......现在终于完美无缺: - )

但是,感谢所有的帮助,我从中学到了很多。

答案 3 :(得分:2)

我想在这种情况下,正确的方法是使用块和多线程。您的代码将如下所示:

dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
dispatch_async(myQueue, ^
{
    while (eOF != 99999) {

        // ...
        // your code
        // ...

        dispatch_async(dispatch_get_main_queue(), ^{
            loadingProgressView.progress += 0.10;
        });
    }
});
dispatch_release(myQueue);

欲了解更多信息,请参阅Paul Hegarty的讲座http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id480479762讲座10,非常清晰的解释和教程。

答案 4 :(得分:0)

你可以试试几件事。

首先,检查UIProgressView的当前值是什么(在增加它之前)

float progress = loadingProgressView.progress;

[loadingProgressView setProgress: progress+0.10];

(在该行上设置断点以查看进度是否增加)

其次,通过以下方式强制更新:

[loadingProgressView setNeedsDisplay];

然后看看会发生什么。