iOS

[iOS/Swift] ViewController Life Cycle (뷰의 생명주기)

meenyweeny 2022. 2. 20. 22:38

iOS 프로젝트를 하면서 정말 중요하다고 느낀 점이 있는데

바로 View의 Life cycle이다!

내가 만든 어플을 실행시키고 사용하면서 뜰 수 많은 뷰들이 어떤 상태로 어떻게 보여지고/사라지는지가 매우 중요했다.

그래야 view controller 마다 매번 만드는 것이 아니라 재사용도 할 수 있고,

같은 view controller지만 안에 담고있는 data의 update도 우리 눈에 보여질 때 마다 최신화 될 수 있고..

이번에 내가 했던 프로젝트는, 특히 유저 간 상호작용으로 정보가 생성되기 때문에, 뷰의 생명주기가 특히 중요했다

 

그래서 View의 생명주기가 무엇인지 알아보고,

뷰의 생명주기의 중요성에 대해 느낀 계기가 된 아주 간단한 예시도 함께 써놓아야겠다.

 

View의 생명 주기란 View Controller가 화면에 보여졌다가 사라지는 과정!

이런 과정을 거치게 되는데요

 

loadView와 viewDidUnload는 우리가 만든 view를 메모리에 올려놓는 역할을 해줍니다!

뷰를 직접 만드는 역할이고, 우리가 관여할 수 있는 부분은 이 두 부분이 아닙니당.

 

그럼 viewDidLoad부터 viewDidDisappear까지 하나하나 살펴보도록 하겠습니다!

 

함수에 크게 will과 did가 있는데,

will이 있는 함수는 ~하기 직전에, did가 있는 함수는 ~한 직후에 호출됩니다.

 

1. viewDidLoad

loadView로 메모리에 view가 로드된 후, 호출되는 함수입니다!

그 view controller를 화면에 여러 차례 띄우더라도, 딱 한 번만 호출되는 함수기 때문에

한 번만 호출되기를 원하는 기능들을 여기에 넣으면 좋을 듯 합니다!

 

2. viewWillAppear

view가 우리 화면에 보이기 직전에 호출되는 함수입니다!

 

3. viewDidAppear

view가 우리 화면에 보인 직후에 호출되는 함수입니다!

 

4. viewWillDisappear

view가 화면에서 사라지기 직전에 호출되는 함수입니다!

 

5.viewDidDisappear

view가 화면에서 사라진 직후에 호출되는 함수입니다!

 

이름만 봐도 감이 오시나요 ,,

 

화면을 실행하면서 한번 함수들 실행시켜 보겠습니다!

 

화면이 실행되자마자

이 세 함수가 순서대로 호출되었습니다!

 

또 다른 뷰로 화면전환버튼을 눌렀더니 (그럼 지금의 뷰는 화면에서 사라지겠죠?)

이 두 함수가 순서대로 호출되었습니다!

 

또 다시 그 뷰로 돌아왔습니다 (그럼 처음의 그 뷰가 다시 화면에 나타나겠죠?)

이 두 함수가 순서대로 호출되었습니다! (처음의 세 함수에서, viewDidLoad만 없음!)

 

그러니, 이미 메모리에 로드되었던 view같은 경우엔,

view가 화면에 보일 땐, viewWillAppear와 viewDidAppear 두 함수가 매번 순서대로 호출되는 것을 알 수 있죠!

 


+)

view의 생명 주기의 중요성에 대해 공부를 하고 너무 심취한 나머지.. viewWillAppear에도 기능들을 마구 때려박았던 적이 있습니다.

viewDidLoad 함수 후에 호출되는 viewWillAppear 함수의 경우엔, 매번 호출되기 때문에

viewDidLoad에 넣을 기능들을 viewWillAppear에 넣어도 같겠지만,, 한번만 호출되어도 될 기능들인 경우엔

viewDidLoad에 한번만 넣는 것이 좋고,

아래에서 보여드릴 예시처럼 view가 "보일 때 마다" 처리해줄 일들만 viewWillAppear에 넣읍시다,,!!

 


실제 적용 예시!

 

-문제 상황-

첫 view controller에서, 이름과 닉네임을 text field에 입력하고

다른 view controller로 화면전환을 했습니다.

그리고 "안녕하세요" 메세지를 보고 다시 첫 view controller로 화면을 전환했어요

그런데~!!! 아까 text field에 입력했던 이름, 닉네임 이라는 글씨들이 그대로 남아있어요

전 이걸 없애고 싶었습니다

이것을 보시면, 이름 닉네임을 text field에 각각 입력하고 화면을 전환했습니다!

그리고 다시 이름, 닉네임을 입력하는 화면으로 돌아왔는데

아까 입력한 이름과 닉네임이 남아있는 것을 볼 수 있습니다.

 

이때 뷰의 생명주기를 이용하면 해결할 수 있어요!

 

그럼 어디다 넣어야 하느냐!

view가 화면에 나타나기 직전!에 호출되는 viewWillAppear에 넣으면 깔끔하게 해결될 것 같습니다!

textfield의 text를 전부 지워주는 removeAll 메서드를 사용해서 지워볼게요!

이렇게 넣어두었답니다~!

빌드를 시켜보면~?

이렇게 쇽 사라진 것을 볼  수 있습니다!

 

 

 

전체 코드입니다!

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var nicknameTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        nameTextField.text?.removeAll()
        nicknameTextField.text?.removeAll()
    }
    
    @IBAction func moveButtonDidTap(_ sender: Any) {
        guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else { return }
        nextVC.modalPresentationStyle = .fullScreen
        self.present(nextVC, animated: true, completion: nil)
    }
}

 

뷰의 생명주기 잘 이용해서 멋진 어플 구현하기 ..!!!!!!!

파이팅~!