작동하지 않습니다), 나는 그렇게 정의 이미지를 다운로드 할 수있는 UIActivityIndicatorView
과 기능을 가지고 결국 표시됩니다. 그러나 activityIndicator
은 화면에 남아 있으며 절대로 사라지지 않습니다. 위의 stopAnimating()
을 호출하는 곳에서는 표시기가 실제로 애니메이션을 멈 춥니 다. 이것은 내가 그것을 부른 직후에 멈추고 아직도 여전히 거기에있는 것이 특히 혼란 스럽습니다.스위프트 UIActivityView stopAnimating (<code>UIImageView</code>의 내 서브 클래스에서
답변
코드에 몇 가지 문제가 있습니다. 가장 큰 것 중 하나는 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()
에 대한 추가 전화는 문제를 일으킬 것입니다.
아, 그 사람이 여러 인스턴스를 알아 내고 싶었습니다. :) –
시작 개발자는 "디버거에서 뷰 계층 구조를 봅니다"는 의미는 아닐 수도 있습니다. (즉,'lazy'는 꼭 필요한 것은 아니며 그 부분은 해결되지 않을 것입니다. 아무것도. 미묘한 힌트는 초보자에게 분실되는 경향이 있습니다. –
글쎄요, "디버거에서 뷰 계층 구조보기"에 대한 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/) 그래서 저는 이것이 꽤 합리적인 힌트라고 생각합니다. –
코드를 실행하고 이미지가로드 될 때까지 기다렸다가 디버거에서 뷰 계층을 봅니다. 그런 다음 속성을 변경하십시오 :'var activityIndicator : UIActivityIndicatorView = { // 같은 몸 }()'그리고 다시보십시오. –