2011-12-29 3 views
0

순서대로 수행 할 작업 : 경고 상자가 처리 (단추 없음)를 표시하고 주 처리 기능이 호출되고 경고 상자가 사라지면 내 탐색 컨트롤러가 시리즈의 다음보기로 이동합니다.다른보기가 변경 될 때 UIAlertView가 표시되지 않음

실제로 발생하는 현상 : 앱이 처리되는 동안 창이 멈추고 내비게이션 컨트롤러가 다음보기로 변경되는 동안 알림 상자가 즉시 표시되고 사라집니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

코드 : [_navigationController dismissModalViewControllerAnimated : NO]; // 카메라가 닫히다 UIAlertView * alert;

alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 
[alert show]; 

[self processImage]; 

[alert dismissWithClickedButtonIndex:0 animated:YES]; 
[self gotoResults]; 
+0

이 항목을 사용하십시오 [self performSelector : @ (processImage)] – userar

답변

2
alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 
[alert show]; 

를 호출

[NSThread detachNewThread: .....] 

을 사용할 수 있습니다 ... 윈도우 동결 문제의 결과로 메인 스레드에서 실행 , UI 이벤트는 메인 실행 루프로 푸시됩니다. 다른 기능에서 다른 작업을 처리 할 수 ​​있습니다. 예를 들어, foo이라는 함수는 다른 작업을 처리합니다. [alert show]으로 전화 한 후 [self performSelector:@selector(foo) withObject:nil afterDelay:0.1]을 호출하여 foo을 호출합니다. 그러면 경고 루프가 표시되는 이벤트를 처리하기 위해 실행 루프가 실행됩니다.

- (void)foo { 
    UIAlert *alert = ... ///< come from above 
    [self processImage]; 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [self gotoResults]; 
} 

편집 : 당신은 -performSelector에 대해 읽을 수 있습니다 : withObject를 : afterDelay : this apple official document에. 당신은 afterDelay에 대한 매개 변수로 0.0을 할당 할 수 있으며, 문서는 말했다 :

delay


메시지가 전송되는 전에 최소 시간. 지연을 0으로 지정한다고해서 반드시 selector가 으로 즉시 수행되는 것은 아닙니다. 선택기는 여전히 스레드의 실행 루프에 대기하고 있으며 은 가능한 한 빨리 수행됩니다.

+0

이것은 좋은 생각 인 것 같습니다.하지만 0.1 초 안에 창이 나타나지 않을 수 있습니까? 경우에 따라 UI가 따라 잡기까지 더 오래 걸릴 수 있습니다. 아니면 그렇지 않은가요? – Jason

+0

내 질문을 편집했습니다. – AechoLiu

1

[자기 processImage은] [alert show]를 호출 할 때 그래서 당신이 AlertView 방법

관련 문제