ViewController 생명주기

동그라미·2024년 12월 2일
8
post-thumbnail

UIViewController 개념


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

  • 한 개의 페이지는 반드시 한 개의 UIViewController 를 가짐.
  • UIViewController 내부에 UIView, UIButton, UIScrollView 등 UIKit 의 UI 클래스들을 배치하며 화면을 구성한다.
    링크텍스트

ViewController 생명주기


  • iOS 의 대표적인 생명주기 2가지
    1. 앱 생명주기 (App Lifecycle) → [1-3. Xcode 빌드] 강의에서 공부했음.
    2. ViewController 생명주기 (ViewController Lifecycle)
  • ViewController Lifecycle

ViewController Lifecycle 메서드 호출 확인


▪️ ViewController 에서 버튼을 클릭하면 AdamViewController 로 이동하도록 구현합니다.

  • ViewController 의 라이프사이클 메서드에 print() 문으로 로그를 남기고, 직접 어떤 타이밍에 어떤 라이프사이클이 호출되는지 확인합니다.

1) viewDidLoad ~viewDidAppear

2) viewWillDisappear ~ viewDidDisappear

3) viewWillAppear ~ viewDidAppear

SceneDelegate.swift

//
//  SceneDelegate.swift
//

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
    }
    // ...
}

ViewController.swift

NSLayoutConstraint 로 구현

//
//  ViewController.swift
//

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)
    }
}

AdamViewController.swift

//
//  AdamViewController.swift
//
//

import UIKit

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

ViewController 를 볼때마다 색상을 랜덤하게 변경하기


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
    )
}
profile
맨날 최선을 다하지는 마러라. 피곤해서 못산다.

2개의 댓글

comment-user-thumbnail
2024년 12월 12일

동그라미네모세모 실종 사건

1개의 답글