微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios4 – 从iOS 5开始,setProgress不再更新UIProgressView

自从iOS 5出来以来,我有一个进度条有点麻烦.下面的代码在iOS 5之前工作正常,但是在iOS 5中,进度条不再显示在循环中设置的新进度.

代码预计可以这样工作:

>创建进度条(作品)
>在新的后台进程中:设置初始进度为0.25(作品)
>在相同的后台进程:更新进度循环(在iOS 4中工作)

这是bar init的代码

// create a progress bar
UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25,coverSizeY - 34.0,coverSizeX*0.5,9.0)];
progressBar.progress = 0.0;
progressBar.progressViewStyle = UIProgressViewStyleBar;

在不同的线程中,它将进度设置为0.25:

// set an initial progress
[progressBar setProgress: 0.25];

稍后更新一个循环中的进度来显示下载进度:

// within a for-loop:
NSNumber *counterPercentage;
for ( pageDownload = 1; pageDownload < pagesTodownload; pageDownload++ ) {
    counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload / (float)((float)pagesTodownload)];
    [progressBar setProgress: [counterPercentage floatValue]];
    [progressBar performSelectorOnMainThread:@selector(setNeedsdisplay) withObject:nil waitUntilDone:YES];
}

…但进度没有显示在屏幕上,进度条停留在设定的初始0.25进度.

iOS 5发行版有什么变化可能会破坏吗?

解决方法

自从iOS 5开关以来,我已经看到过很多问题,而且我不知道为什么只有在iOS 5中出现问题.但主要是因为我不知道为什么以前没有问题.

在你的代码中,你调用[progressBar setProgress:[counterPercentage floatValue]];从后台线程.这是一个UI调用,不应该从一个后台线程.此外,您也可以调用setNeedsdisplay,这不需要更新progressBar,因为UIProgressView知道如何显示它. iOS 5似乎已经使更新UI的要求更加严格,但只是至关重要的是什么是最佳实践.

对我来说,这看起来像块的完美用途.使用块,您的for循环可以这样写:

for ( pageDownload = 1; pageDownload < pagesTodownload; pageDownload++ ) {
        // Other stuff in background
    dispatch_async(dispatch_get_main_queue(),^{
        progressBar.progress = ((float)pageDownload/(float)pagesTodownload);
    });
        // Other stuff in backgroud
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐