코딩

swift 뷰콘트롤러 생명주기 알아보자

kingarthur 2024. 7. 15. 19:35

UIKit 앱의 뷰 계층을 관리하는 개체입니다.

  • 한 개의 페이지는 반드시 한 개의 UIViewController 를 가짐.
  • UIViewController 내부에 UIView, UIButton, UIScrollView 등 UIKit 의 UI 클래스들을 배치하며 화면을 구성한다.
  • iOS 의 대표적인 생명주기 2가지
    1. 앱 생명주기 (App Lifecycle) → [1-3. Xcode 빌드] 강의에서 공부했음.
    2. ViewController 생명주기 (ViewController Lifecycle)
  • ViewController Lifecycle

 

init - 생성자 

 

leadView - 처음 가지는 뷰(무조건 있어야지 뷰가 생성된다)

 

viewDidLoad - 뷰가 메모리에 올려질때 사용( 이건 자주 봤을 것이다 뷰 컨트롤러 만들면 무조건 있는거니깐) 

 

viewWillappear - 뷰가 유저에게 보이기 직전 단계라고 생각하면 된다.

 

viewISappearing - 뷰를 만들고 있다고 생각하면 된다. 

 

viewDidappear - 실제 완전히 나타났다는 것이다. 즉 유저에게 보이는 보습이다. 

 

자 여기까지가 뷰가 생성되는 과정이다. 

 

그리고 만약 뷰 콘트롤러가 두개여서 버튼을 누르면

 

다음 화면으로 넘어가게 된다면?? 

 

그러면 어떻게 될 것이냐? 

 

 

먼저 viewDidLoad 생성되고 

 

viewWillDisappear - 이전 화면이 없어질거야 ~ 이러면서 화면을 없앨 준비를 하고 

 

viewDidDisapper - 이제 완젼히 없어졌다 ~ 이렇게 나타난다. 

 

자 그럼 다시 네비게이션을 만들면 자동으로 생성되는 Back 버튼을 누른다면 

 

뷰의 생명주기는 어떻게 될 것인가? 

 

첫번째 ViewDidLoad 먼저 나타날 것인가? 아니면 LoadView? 

 

 

자 여기서 중요하다 ~ 

 

처음 viewDidLoad 호출하게 된다면 이미 뷰가 생성되어있어서 다시 재생성을 하지 않고

 

메모리에 올려져있게 된다. 

 

그래서 다시 뒤로 돌아가게 된다면 

 

viewWillAppear 호출 되며 차례대로 viewIsAppearing -> viewDidAppear 호출하게되서 

 

사용자에게 보여지게 된다는 것이다 ~

 

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = scene as? UIWindowScene else { return }
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UINavigationController(rootViewController: ViewController())
        window.makeKeyAndVisible()
        self.window = window
    }
    // ...
}

 

그래서 맨처음 씬을 만들게 되면 이렇게 코드가 작성되게 된다. 

 

예제로는 첫번째 화면 

import UIKit

class ViewController: UIViewController {

    let button = UIButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configureUI()
        print("viewDidLoad")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear")
    }

    override func viewIsAppearing(_ animated: Bool) {
        super.viewIsAppearing(animated)
        print("viewIsAppearing")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("viewWillDisappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("viewDidDisappear")
    }
    
    private func configureUI() {
        view.addSubview(button)
        view.backgroundColor = .white
        
        button.setTitle("페이지 이동", for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchDown)
        button.backgroundColor = .red
        button.setTitleColor(.white, for: .normal)
        button.titleLabel?.font = .boldSystemFont(ofSize: 30)
        button.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            button.widthAnchor.constraint(equalToConstant: 200),
            button.heightAnchor.constraint(equalToConstant: 120),
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
    
    @objc
    private func buttonTapped() {
        self.navigationController?.pushViewController(AdamViewController(), animated: true)
    }
}

 

두번째 화면 

import UIKit

class AdamViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .orange
        print("AdamViewController viewDidLoad")
    }
}

 

 

 

아래 코드를 작성하게 되면 생명주기에 대해 조금더 이해하기 쉽다 

override func viewWillAppear(_ animated: Bool) {
    print("viewWillAppear")
    
    self.view.backgroundColor = UIColor(
        red: .random(in: 0...1),
        green: .random(in: 0...1),
        blue: .random(in: 0...1),
        alpha: 1.0
    )
        
    self.button.backgroundColor = UIColor(
        red: .random(in: 0...1),
        green: .random(in: 0...1),
        blue: .random(in: 0...1),
        alpha: 1.0 // 투명도이니 잘 조절할 것
    )
}

이렇게 하면 뷰생명주기를 콘솔창을 보면 잘 나오니 이해하기 쉬울 것이다. 그럼 안뇽

반응형