Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/iOS 개발

[iOS 앱 개발 - Swift] 뷰의 상태변화 감지

sm_amoled 2019. 8. 8. 12:27

오늘 볼 내용으로 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