2009-12-04 3 views
8

UIActivityIndicatorView에서 startAnimating을 호출하면 시작되지 않습니다. 왜 이런거야?iPhone UIActivityIndicatorView가 시작 또는 중지되지 않습니다.

[블로그 스타일의 자체 답변 질문입니다. 아래의 솔루션은 아마도 더 나은 사람이있다, 나를 위해 작동하지만]

+0

당신은 수 있도록 할 수 있습니다를 그것은 당신이 블로그 스타일 자체 답변 질문을 게시하는 것이 분명합니다. – TechZen

답변

16

이 같은 코드를 작성하는 경우 : 당신이 실제로 시작하고 중지하는 UI 시간을 제공하지 않는

- (void) doStuff 
{ 
    [activityIndicator startAnimating]; 
    ...lots of computation... 
    [activityIndicator stopAnimating]; 
} 

을 모든 계산이 주 스레드에 있기 때문에 활동 표시기가 표시됩니다. 당신은 별도의 스레드에서 계산을 넣어, 그것은 stopAnimation를 호출하기 전에 끝날 때까지 기다릴 수,

- (void) threadStartAnimating:(id)data { 
    [activityIndicator startAnimating]; 
} 

- (void)doStuff 
{ 
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil]; 
    ...lots of computation... 
    [activityIndicator stopAnimating]; 
} 

또는 : 하나 개의 솔루션은 별도의 스레드에서 startAnimating를 호출하는 것입니다.

+1

Thx 솔루션! 동일한 문제가 발생했습니다. (+1) – Prine

+0

이 메서드는 새 스레드를 시작합니다 .. ??? 그렇다면 어디서 어떻게 멈출 지 .. ?? –

+0

솔루션을 많이 가져 주셔서 감사합니다. 내게 도움이 .. – Shivaay

12

내가 일반적으로 할 : 나는 내 코드는 맹인 인 겪었처럼

[activityIndicator startAnimating]; 
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01]; 

... 

- (void)lotsOfComputation { 
    ... 
    [activityIndicator stopAnimating]; 
} 
+0

이 방법은 나를 위해 잘 작동했습니다. – Arash

+0

내가 사용하는 차이점을 가지고 똑같이하고있다. (void) performBlock : (void (^) (void)) 블록 afterDelay : (NSTimeInterval) delay; http://forrst.com/posts/Delayed_Blocks_in_Objective_C-0Fn에서 0.0을 지정하면 진행 표시기가 표시되지 않고 0.01은 100Hz 모니터가 깜박일 때까지의 시간입니다. – 18446744073709551615

+0

솔루션을 주셔서 감사합니다 ... –

0

좋아, 미안 보인다.

나는이 같은 표시를 종료했습니다

[activityIndicator removeFromSuperview]; 
activityIndicator = nil; 

그래서 하나 개를 실행 한 후 activityIndicator이 완전히 제거되었습니다.

0

이 질문은 매우 유용합니다. 그러나 대답 게시판에서 누락 된 한 가지는 UIActivityIndicatorView가 아닌 ​​별도의 스레드에서 오랜 시간이 걸리는 모든 작업을 수행해야한다는 것입니다. 이렇게하면 UI 인터페이스에 응답하지 않습니다.

- (void) doLotsOFWork:(id)data { 
    // do the work here. 
} 

    -(void)doStuff{ 
    [activityIndicator startAnimating]; 
    [NSThread detachNewThreadSelector:@selector(doLotsOFWork:) toTarget:self withObject:nil]; 
    [activityIndicator stopAnimating]; 
} 
+0

나는 이걸로 갈 것입니다. 그게 최선의 설명입니다. 하나의 문제는 내가 분리 한 메서드에서 표시기에 애니메이션을 적용하지 않도록 호출을 이동한다는 것입니다. 메소드가 완료되면 애니메이션을 중지합니다. –

1

모든 UI 요소는

[self performSelectorOnMainThread:@selector(startIndicator) withObject:nil waitUntilDone:NO]; 

다음 주 스레드에서 할 필요 : 필요한 경우

-(void)startIndicator{ 
    [activityIndicator startAnimating]; 
} 
1

, 빠른 3 버전 :

func doSomething() { 
    activityIndicator.startAnimating() 
    DispatchQueue.global(qos: .background).async { 
     //do some processing intensive stuff 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 
     } 
    } 
} 
관련 문제