천천히 해도 괜찮아

UINavigationViewController로 ViewController Lifecycle 테스트 본문

iOS/Swift

UINavigationViewController로 ViewController Lifecycle 테스트

엘리아 2022. 5. 1. 00:37

안녕하십니까? 엘리아입니다! 😆

지난 글에서 UIViewController를 present 하고 dismiss 하는 방식으로 ViewController Lifecycle을 보여드렸습니다. 그런데 제가 보여드리고 싶었던 viewDidLoad()와 viewWillAppear()의 차이를 알려드리지 못했습니다. 그래서 오늘은 UINavigationViewController를 이용해서 ViewController Lifecycle을 설명하려고 합니다.


UINavigationViewController

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

 

Apple Developer Documentation

 

developer.apple.com

Apple 문서를 참고하면 UINavigationViewController는 container view controller인데 navigation 인터페이스에서 한 개 이상의 UIViewController를 관리합니다. navigation 인터페이스는 한 번에 하나의 UIViewController를 보여줍니다. view controller에서 item을 선택하면 새로운 view contorller를 화면에 push 하고 화면 상단 back 버튼을 클릭하면 상단의 view controller가 pop 됩니다. 

쉽게 말해서 stack기반으로 UIViewController를 관리하는 container로 생각하면 될 듯합니다..! UINavigationViewController와 UIViewController를 이용해서 Lifecycle을 테스트해보겠습니다.

첫 번째 화면 코드입니다.

//  ViewController.swift

import UIKit

class ViewController: UIViewController {

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        print("🐶 First init 호출")
    }
    
    override func loadView() {
        super.loadView()
        print("🐶 First loadView 호출")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("🐶 First viewDidLoad 호출")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("🐶 First viewWillAppear 호출")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("🐶 First viewDidAppear 호출")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("🐶 First viewWillDisappear 호출")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("🐶 First viewDidDisappear 호출")
    }
    
    deinit {
        print("🐶 First deinit 호출")
    }
}

print 할 때 글자만 나오면 실행했을 때 어떤 화면에서 print 했는지 한눈에 들어오지 않아서 첫 번째 UIViewController는  🐶를 두 번째 UIViewController는 🐱를 print문에 넣었습니다. 

//  SecondViewController.swift

import UIKit

class SecondViewController: UIViewController {

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        print("🐱 Second init 호출")
    }
    
    override func loadView() {
        super.loadView()
        print("🐱 Second loadView 호출")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("🐱 Second viewDidLoad 호출")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("🐱 Second viewWillAppear 호출")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("🐱 Second viewDidAppear 호출")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("🐱 Second viewWillDisappear 호출")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("🐱 Second viewDidDisappear 호출")
    }
    
    deinit {
        print("🐱 Second deinit 호출")
    }
    
}

앱 화면은 아래와 같습니다. FirstViewController에서 Next button을 누르면 SecondViewController로 넘어가고 SecondViewController에서 Back button을 누르면 다시 FirstViewController로 돌아옵니다. 여기서 NavigationController의 좋은 점은 Next 버튼 action으로 SecondViewController에 연결하면 SecondViewController에 자동으로 Back button이 생긴다는 것입니다. ^^ 

app 화면

UINavigationViewController LifeCycle Test

영상을 보고 전 글의 영상과 다른 점을 눈치채셨나요? 전 글에서는 SecondViewController에서 FirstViewController로 돌아왔을 때 SecondViewController가 사라지는 method들만 호출되고 FirstViewController의 method는 호출되지 않았습니다. 

그런데 이번에는 SecondViewController에서 FirstViewController로 돌아올 때 FirstVC의 viewWillAppear가 다시 호출됩니다. 

여기가 중요합니다. viewDidLoad와 viewWillAppear는 view가 나타나기 전에 호출된다는 공통점이 있습니다. 하지만 viewDidLoad는 view lifeCycle에 단 한 번만 호출되고 viewWillAppear는 view lifeCycle에 다시 호출될 수 있습니다. NavigationViewController에 있는 ViewController는 pop 하면 밑에 깔려있던 viewController가 다시 보일 때마다 viewWillAppear method가 호출된다는 것입니다. 만약 App에서 화면이 보일 때마다 실행해 줄 method가 있다면(data를 다시 불러오는 작업이라던가) viewWillAppear나 viewDidAppear에 넣어도 괜찮겠네요..! 

UINavigationViewController는 많은 UIViewController를 관리하기 편하게 해 줍니다. View가 보이는 순서가 중요한 상황에서는 NavigationViewController가 필요할 겁니다. 

소스 코드가 필요하시면 아래 링크에서 다운받으실 수 있습니다. ViewControllerLifecycleNaviExample 폴더 안에 있습니다!

https://github.com/yuminc03/Tistory_Swift_SourceCode

 

GitHub - yuminc03/Tistory_Swift_SourceCode: 티스토리 블로그에 올린 Swift글에 있던 코드를 올립니다.

티스토리 블로그에 올린 Swift글에 있던 코드를 올립니다. Contribute to yuminc03/Tistory_Swift_SourceCode development by creating an account on GitHub.

github.com


아직 iOS 초보 개발자라 틀린 부분이 분명히 존재할 수 있습니다. 틀린 부분에 대한 지적은 댓글로 부탁드립니다! 그럼 저는 다음에 새로운 글로 다시 찾아오겠습니다. 긴 글 읽어주셔서 감사합니다! 

Comments