2012-01-10 2 views
9

iOS 5가 출시 된 이후로 진행률 막대에 약간 문제가 있습니다. 아래의 코드는 iOS 5 이전에는 제대로 작동했지만 iOS 5에서는 진행률 표시 줄에 더 이상 루프 내에서 설정된 새 진행 상황이 표시되지 않습니다.setProgress는 iOS 5 이후 더 이상 UIProgressView를 업데이트하지 않습니다.

이 코드는 다음과 같이 작동 할 것으로 예상된다 : 설정 같은에서 0.25 (작품)의 초기 진행

  • 을 :

    1. 가 진행 표시 줄 새로운 백그라운드 프로세스에서 (작품)
    2. 만들기 백그라운드 프로세스가 :

      : 루프를 통해가는 동안 진행 상황을 업데이트

    여기 바 초기화에 대한 코드입니다 (아이폰 OS 4 일) 1,515,

    // 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 릴리스에서 변경 될 수있는 변경 사항이 있습니까?

  • 답변

    18

    iOS 5 스위치 이후로 많은 질문을 보았습니다. 왜 iOS 5에만 문제가 있는지 잘 모르겠습니다.하지만 왜 그랬는지 모르겠습니다. 전에 문제.

    코드에서 [progressBar setProgress: [counterPercentage floatValue]];을 백그라운드 스레드에서 호출합니다. 이것은 UI 호출이며 백그라운드 스레드로 만들어서는 안됩니다. UIProgressView 자체 표시 방법을 알고 있으므로 progressBar을 업데이트 할 필요가없는 setNeedsDisplay으로 전화하십시오. iOS 5는 UI를 더욱 엄격하게 업데이트하기위한 요구 사항을 만들었지 만, 어쨌든 모범 사례가 무엇인지에 대한 요점 만 있습니다.

    내 눈에는 이것이 블록을 완벽하게 사용하는 것처럼 보입니다. 루프를 위해이 방법을 쓸 수있는 당신의 블록을 사용하여 :

    그것은에서 iOS 5에서 작업하고 그것에하는 가장 쉬운 방법을 수행
    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 
    } 
    
    +1

    감사합니다. 또한 작업 솔루션을 제공하는 것 이상을 설명해 주셔서 감사합니다 .-) – favo

    2

    은 여기에 있습니다 :

    .H 파일 :

    IBOutlet UIProgressView *WhateverYouWantToCallIt; 
    

    . m 파일 :

    [WhateverYouWantToCallIt setProgress:(float) 0.3]; 
    

    그리고 0.3을 말한다 곳, 당신은 당신이 (0 ~ 1 이내) 원하는대로 값을 넣을 수 있습니다

    +0

    @ user1791131 iOS 5에서는 작동하지 않습니다. 주된 문제는 메인 스레드가 아닌 다른 스레드에서 UI를 변경하고 있다는 것입니다. 주 스레드가 아닌 모든 스레드에서 만든 UI 변경 사항은 게시되지 않습니다. – BigSauce

    관련 문제