2017-10-17 3 views
0

작동하지 않습니다), 나는 그렇게 정의 이미지를 다운로드 할 수있는 UIActivityIndicatorView과 기능을 가지고 결국 표시됩니다. 그러나 activityIndicator은 화면에 남아 있으며 절대로 사라지지 않습니다. 위의 stopAnimating()을 호출하는 곳에서는 표시기가 실제로 애니메이션을 멈 춥니 다. 이것은 내가 그것을 부른 직후에 멈추고 아직도 여전히 거기에있는 것이 특히 혼란 스럽습니다.스위프트 UIActivityView stopAnimating (<code>UIImageView</code>의 내 서브 클래스에서

+0

코드를 실행하고 이미지가로드 될 때까지 기다렸다가 디버거에서 뷰 계층을 봅니다. 그런 다음 속성을 변경하십시오 :'var activityIndicator : UIActivityIndicatorView = { // 같은 몸 }()'그리고 다시보십시오. –

답변

3

코드에 몇 가지 문제가 있습니다. 가장 큰 것 중 하나는 activityIndicator를 계산 된 속성으로 만들었습니다. 참조 할 때마다 클로저 코드가 실행되고 새로운, 결코 전에 보지 못한 활동 표시기가 나타납니다. 이 코드를 테스트 해보십시오 :

print(String(format: "activityIndicator address = %X", activityIndicator)) 
print(String(format: "activityIndicator address = %X", activityIndicator)) 
print(String(format: "activityIndicator address = %X", activityIndicator)) 

각 인쇄 문에 대해 다른 주소를 사용한다는 점에 유의하십시오.

즉, activityIndicator 또는 self.activityIndicator을 참조 할 때마다 다른 활동 표시기를 작성하여보기 계층 구조에 추가합니다. 그것은 당신이 원하는 것이 아닙니다. 그 코드는 과제를 가지고 있으며, 폐쇄 괄호 afterwords을 가지고 (()) 방법

lazy var activityIndicator: UIActivityIndicatorView = { 
    let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .white) 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.center = CGPoint(x: self.frame.width/2, y: self.frame.height/2) 
    self.addSubview(activityIndicator) 
    return activityIndicator 
}() 

참고 :

대신, 변수 게으른 VAR을합니다.

lazy 한정자는 변수가 처음 참조 될 때까지 생성되지 않고 한 번만 생성된다는 것을 의미합니다.

클로저 이후의 괄호는 함수처럼 클로저가 호출되고 변수 activityIndicator에 해당 클로저의 결과가 포함됨을 의미합니다.

또한 stopAnimating() 호출을 제거해야하지만 dataTask 완료 핸들러 내에 DispatchQueue.main.async 호출이 있어야합니다. 다운로드가 완료되면 애니메이션 작업을 중단하고 메인 스레드에서와 같은 UI 호출을 만들어야합니다. stopAnimating()에 대한 추가 전화는 문제를 일으킬 것입니다.

+0

아, 그 사람이 여러 인스턴스를 알아 내고 싶었습니다. :) –

+0

시작 개발자는 "디버거에서 뷰 계층 구조를 봅니다"는 의미는 아닐 수도 있습니다. (즉,'lazy'는 꼭 필요한 것은 아니며 그 부분은 해결되지 않을 것입니다. 아무것도. 미묘한 힌트는 초보자에게 분실되는 경향이 있습니다. –

+0

글쎄요, "디버거에서 뷰 계층 구조보기"에 대한 Google의 가장 인기있는 히트는 [Apple 's Debugging guide]입니다 (https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows). .html). 그 다음에 Ray Wenderlich 가이드가 있으며 그 다음에 스택 오버 플로우에 관한 몇 가지 질문이 있습니다. [1] (https://stackoverflow.com/q/5150186/) [2] (https://stackoverflow.com/q/24728326/) 그래서 저는 이것이 꽤 합리적인 힌트라고 생각합니다. –

관련 문제