Ios4 自iOS 5之后,setProgress不再更新UIProgressView

Ios4 自iOS 5之后,setProgress不再更新UIProgressView,ios4,ios5,nsnumber,uiprogressview,Ios4,Ios5,Nsnumber,Uiprogressview,自从iOS 5问世以来,我在进度条方面遇到了一些问题。下面的代码在iOS 5之前运行良好,但在iOS 5中,进度条不再显示循环中设置的新进度 代码的工作原理如下: 创建进度条(工作) 在新的后台进程中:将初始进度设置为0.25(工作) 在相同的后台过程中:在循环过程中更新进度(在iOS 4中工作) 以下是bar init的代码: // create a progress bar UIProgressView *progressBar = [[UIProgressView alloc] initW

自从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];
    }
    
    //在for循环中:
    NSNumber*对应百分比;
    用于(pageDownload=1;pageDownload
    …但进度未显示在屏幕上,进度条停留在初始设置的0.25进度


    iOS 5版本是否有任何可能破坏它的变化?

    自从iOS 5切换以来,我看到了很多类似这样的问题,我不确定为什么只有iOS 5才会出现问题。但主要是因为我不确定为什么以前没有问题

    在代码中调用
    [progressBar setProgress:[counterPercentage floatValue]]来自后台线程。这是一个UI调用,不应该从后台线程进行。您还可以调用
    setNeedsDisplay
    ,这对于更新
    progressBar
    是不必要的,因为
    UIProgressView
    知道如何显示自己。iOS 5似乎对更新用户界面的要求更加严格,但仅限于最佳实践

    在我看来,这似乎是块的完美用途。使用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
    }
    
    for(pageDownload=1;pageDownload
    它在iOS 5中确实有效,最简单的方法是:

    .h文件:

    IBOutlet UIProgressView *WhateverYouWantToCallIt;
    
    .m文件:

    [WhateverYouWantToCallIt setProgress:(float) 0.3];
    

    如果上面写着0.3,你可以把任何你喜欢的值(在0到1之间)

    谢谢你,这很有效!另外,感谢您的解释,不仅仅是提供一个可行的解决方案:-)@user1791131它在iOS 5中不起作用。主要问题是,他正在从主线程以外的线程进行UI更改。从非主线程的任何线程对UI所做的任何更改都不会发布。