swift의 확장을 통한 로딩 표시기 공통화

8589 단어 iOSUIKitSwift

전체 화면에서 공통 로딩 표시기를 구현하고 싶습니다.



UI 조작 차단하는 시스템의 이런 것을 전체 화면에서 언제든지 호출할 수 있도록 하고 싶다


모처럼 swift이기 때문에 UIViewController의 확장으로 쓰고 싶습니다.



BaseViewController적인 클래스에 공통 함수 만들어 계승시켜 가는 것은 Swifty가 아닌 생각이 들기 때문에, UIViewController의 extension로 실현시키고 싶다. . .

Swift의 확장에는 저장 속성이 없습니다.



처음 시도한 것은 다음 방법 ※ 물론 빌드 오류
swift의 확장은 컴퓨팅 속성 만 가지고 있기 때문에이 접근법을 사용할 수 없습니다.

UIViewController+Extension.swift

extension UIViewController {

    let indicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
    let grayOutView = UIView(frame: self.view.frame)

    func startIndicator() {
        loadingIndicator.center = self.view.center
        grayOutView.backgroundColor = .black
        grayOutView.alpha = 0.6
        self.view.addSubview(grayOutView)
        self.view.addSubview(loadingIndicator)
        self.view.bringSubview(toFront: grayOutView)
        self.view.bringSubview(toFront: loadingIndicator)

        loadingIndicator.startAnimating()
    }

    func dismissIndicator() {
        indicatorView.removeFromSuperView()
        grayOutView.removeFromSuperView()
    }
}

최종 구현 방법



UIView의 tag 속성을 이용하여 식별, 표시, 숨기기
아주 간단하게, 쓸모없는 것 같은 값을 할당해 처리하는 것만(이번은 999를 사용)

UIViewController+Extension.swift
extension UIViewController {

    func startIndicator() {

        let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)

        loadingIndicator.center = self.view.center
        let grayOutView = UIView(frame: self.view.frame)
        grayOutView.backgroundColor = .black
        grayOutView.alpha = 0.6

        // 他のViewと被らない値を代入
        grayOutView.tag = 999

        grayOutView.addSubview(loadingIndicator)
        self.view.addSubview(grayOutView)
        self.view.bringSubviewToFront(grayOutView)

        loadingIndicator.startAnimating()
    }

    func dismissIndicator() {
        self.view.subviews.first(where: { $0.tag == 999 })?.removeFromSuperview()
    }

}

사용방법



SampleViewController.swift

    func sampleFunc() {
        // ローディング開始
        startIndicator()
        DispatchQueue.global(qos: .default).async {
            // 重い処理や通信処理
            DispatchQueue.main.async {
                // ローディング非表示
                self.dismissIndicator()
            }
        }
    }

더 스마트한 방식 모집 중



swift의 extension으로 쓰고 목적은 달성되었습니다만, 개인적으로 tag로 판정하는 것이 확실히 오지 않았기 때문에,
더 좋은 방법이 있습니다! 라는 분이 있으면 코멘트 부탁드립니다!

좋은 웹페이지 즐겨찾기