Jerry's Bakery

[iOS] ViewController Lifecycle(라이프사이클) 본문

개발/iOS

[iOS] ViewController Lifecycle(라이프사이클)

_Jerry 2021. 10. 6. 03:44

안녕하세요 Jerry입니다.

 

ViewController과 Lifecycle에 대해서 알아보겠습니다.

 

iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해 댓글 남겨주시면 감사하겠습니다.

 

우선 ViewController가 무엇인지에 대해 알아보겠습니다. 아래 Apple Document를 참고했습니다.

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

 

ViewController란?

UIViewController 클래스는 모든 ViewController에 공통적인 공유 동작을 정의하는 클래스입니다. UIViewController 클래스의 인스턴스를 직접 만드는 경우는 거의 없고, 대신 UIViewController의 하위 클래스를 만들고 ViewController의 View 계층 구조를 관리하는 데 필요한 메서드와 속성을 추가하여 사용합니다.

 

Xcode에서 새 프로젝트를 생성하면 ViewController.swift 파일이 자동으로 생성됩니다. ViewController 클래스는 UIViewController 클래스를 상속받고, viewDidLoad 메서드가 오버라이딩 되었음을 확인할 수 있습니다.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

 

ViewController의 책임은 다음과 같습니다.

  • 일반적으로 기본 데이터 변경에 대한 응답으로 View의 내용을 업데이트합니다.
  • View와 사용자 상호 작용에 응답합니다.
  • View 크기 조정 및 전체 인터페이스 레이아웃을 관리합니다.
  • 앱에서 다른 ViewController를 포함한 다른 오브젝트와 조정합니다.

 

View와 관련된 Notification 처리

View가 화면에 나타나거나 사라지는 것과 같이 상황이 변경되면 ViewController는 자동으로 자체 메서드를 호출하여 하위 클래스가 변경 사항에 응답할 수 있습니다. 

아래 그림은 ViewController의 View에 대해 가능한 상태 전환을 보여줍니다. Disappeared, Appearing, Appeared, Disappearing 네 가지 상태가 있습니다. 화면이 변화함에 따라서 ViewController는 viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear 메서드를 호출하여 변화를 다른 클래스들이 반응할 수 있도록 합니다.

ViewController 상태 전환

viewDidLoad

func viewDidLoad()

이 메서드는 새 프로젝트를 만들었을 ViewController.swift에 자동 생성되어 있는 메서드입니다.

View의 초기화를 수행할 때 사용하는 메서드입니다.

이 메서드는 ViewController가 View 계층 구조를 메모리에 로드한 후에 호출됩니다.

이 메서드는 View 계층 구조가 nib 파일에서 로드되었는지 또는 loadView() 메서드에서 프로그래밍 방식으로 생성되었는지 여부에 관계없이 호출됩니다. 일반적으로 이 메서드를 재정의하여 nib 파일에서 로드된 View에 대한 추가 초기화를 수행합니다.

viewWillAppear

func viewWillAppear(_ animated: Bool)

View가 View 계층에 추가될 것임을 ViewController에게 알릴 때 사용되는 메서드입니다.

이 메서드는 ViewController의 View가 View 계층에 추가되기 전과 View를 표시하기 위해 애니메이션이 구성되기 전에 호출됩니다.

viewDidLoad와의 차이점은 첫 번째 화면에서 두 번째 화면으로 이동했다가 다시 첫 번째 화면으로 돌아온다면 viewDidLoad 메서드는 이미 메모리에 로드되어있기 때문에 실행되지 않지만 viewWillAppear메서드는 실행됩니다.

viewDidAppear

func viewDidAppear(_ animated: Bool)

View가 View 계층에 추가되었음을 ViewController에게 알리는 데 사용되는 메서드입니다.

이 메서드는 View가 화면에 완전히 나타난 이후 호출됩니다.

viewWillDisappear

func viewWillDisappear(_ animated: Bool)

View가 View 계층에서 제거될 것임을 ViewController에게 알리는 데 사용되는 메서드입니다.

이 메서드는 View가 계층에서 사라지기 직전 호출됩니다. 

viewDidDisappear

func viewDidDisappear(_ animated: Bool)

View가 View 계층에서 제거되었음을 ViewController에게 알리는 데 사용되는 메서드입니다.

View가 계층에서 사라졌을 때 이 메서드가 호출됩니다.

 


실습

ViewController Lifecycle 관련 메서드가 언제 호출되는지에 대해 실습을 통해 확인해보겠습니다.

아래 그림은 앱 전체 구조를 나타낸 것입니다. Lifecycle 메서드가 호출되는 것을 확인하기 위해 각 메서드를 오버라이딩 하여 호출된 메서드를 출력합니다.

코드는 아래와 같습니다. UIViewController 클래스의 메서드를 오버라이딩 하여 호출되는 메서드를 출력합니다.

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print("1: viewDidLoad")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        print("1: viewWillAppear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        print("1: viewDidAppear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("1: viewWillDisappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        print("1: viewDidDisappear")
    }
}
class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print("2: viewDidLoad")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        print("2: viewWillAppear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        print("2: viewDidAppear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("2: viewWillDisappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        print("2: viewDidDisappear")
    }
}

앱을 실행했을 때 첫 번째 페이지 ViewController의 viewDidLoad -> viewWillAppear -> viewDidAppear 메서드가 순서대로 호출된 것을 확인할 수 있습니다.

그리고 두 번째 페이지로 이동 버튼을 클릭했을 때 두 번째 화면으로 전환되고, 첫 번째 페이지 ViewController의 viewWillDisappear -> viewWillDidAppear메서드가 호출되고, 두 번째 페이지 ViewController의 viewDidLoad -> viewWillAppear -> viewDidAppear 메서드가 호출된 것을 확인할 수 있습니다.

그리고 다시 뒤로 가기 버튼을 누르면 첫 번째 화면으로 전환되고, 두 번째 페이지 ViewController의 viewWillDisappear -> viewDidDisappear 메서드가 호출되고, 첫 번째 페이지 ViewController의 viewWillAppear -> viewDidAppear 메서드가 호출된 것을 확인할 수 있습니다.

Comments