View

300x250

오늘 볼 내용으로 View Controller를 새로 만들어주면 항상 기본적으로 들어있던 viewDidLoad 메서드가 어떤 역할을 하는지 알 수 있게 될 것 같네요! 그 밖에도 화면이 바뀌는 순간 뒤에서는 어떤 작업을 처리하고 있는지를 알 수 있겠네요.

바로 요 녀석!

뷰의 상태변화 감지

화면에 보여지는 뷰가 바뀌면, 뷰 컨트롤러는 자동으로 특정한 메서드를 호출해서 이 변화에 다른 클래스들이 반응할 수 있도록 합니다. viewWillAppear 같은 메서드를 사용해 뷰에 보여줄 컨텐츠를 미리 로드하여 준비하고, viewWillDisappear 같은 메서드를 활용하여 삭제될 중요한 정보들을 미리 따로 저장해둘 수 있습니다.

아래 그림은 '나타남', '사라짐' 두 개의 상태와 그 사이의 여러 상태변화를 나타낸 그림입니다. 모든 'will' 메서드가 'did'메서드와 쌍을 이루는 것은 아니지만, 만약에 'will' 메서드로 작업을 시작한 경우에 마지막에는 'did' 메서드로 작업이 끝내야 합니다.

  • viewDidLoad - 뷰 계층을 메모리에 로드한 직후에 수행합니다. 주로 뷰의 초기화작업을 담당합니다.
  • viewWillAppear - 뷰가 계층에 추가되고, 화면에 표시되기 직전에 수행합니다. 화면이 새로 올라올 때마다 수행하기 때문에 그때마다 수행해야 할 작업을 담당하기에 유용합니다.
  • viewDidAppear - 뷰가 화면에 표시된 이후에 수행합니다. 뷰를 보여줄 때 필요한 추가적인 작업을 담당합니다.
  • viewWillDisappear - 뷰가 계층에서 사라지기 직전에 수행합니다. 뷰를 생성하고나서 했던 행동들을 되돌리는 작업을 하거나 작성 또는 선택된 정보들을 삭제되기 전에 저장해두는 작업을 수행합니다.
  • viewDidDisappear - 뷰가 계층에서 사라진 뒤 수행합니다. 뷰를 숨기는 작업을 수행합니다.

주의 할 점은 위와 같은 메서드들을 직접 사용할 때는 override 키워드와 super 키워드를 명시적으로 붙여줘야 합니다.

( 메서드 오버라이딩을 통해 이 메서드를 사용할때는 현재 클래스에서 선언된 것을 사용한다고 명시해두기 -> 부모의 viewDidLoad를 호출해 부모가 수행하는 작업 (필수작업) 을 수행 + 내가 원하는 작업을 수행 ) 

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

이 밖에도 레이아웃이 변경된 경우에 사용할 수 있는 메서드나 다른 메서드도 여럿 있습니다. 필요한 경우 공식문서를 뒤져가며 찾아서 사용하면 될 것 같네요!


상태변화 감지를 직접 해보기

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print("ViewController의 메모리에 View가 Load됨")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("ViewController의 view가 Load됨")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("ViewController의 view가 화면에 나타남")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("ViewController의 view가 사라지기 전")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("ViewController의 view가 사라짐")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print("ViewController의 SubView를 레이아웃 하려함")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        print("ViewController의 SubView를 레이아웃 함")
    }

 

위와 같은 ViewController 클래스를 작성해주고, 실행을 하면 다음과 같은 결과를 얻을 수 있어요.

 

 

메모리에 View를 로드하고, 레이아웃을 설정하는 건 한 번 수행되는 작업이고, Appear / Disappear같은 작업은 뷰가 보여지고 사라질 때마다 수행되어야 하는 작업이기에 계속해서 메서드가 호출되는 것을 볼 수 있습니다.


https://developer.apple.com/documentation/uikit/uiviewcontroller

 

UIViewController - UIKit | Apple Developer Documentation

Specifies whether a view controller, presented non-fullscreen, takes over control of status bar appearance from the presenting view controller.

developer.apple.com

www.edwith.org

 

에듀케이션위드 : edwith

에드위드(edwith)는 네이버(NAVER)와 커넥트재단(CONNECT)이 제공하는 온라인 강좌(MOOC : Massive Online Open Course) 교육 플랫폼입니다. 에듀케이션위드(education with) 에드위드(edwith)로 분야별 명품 강좌를 무료(Free Course)로 수강하세요.

www.edwith.org

 

320x100
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31