개발하는 동글 :]

[TIL],[UIKit],[UIViewController],[ViewController의 생명주기] 본문

카테고리 없음

[TIL],[UIKit],[UIViewController],[ViewController의 생명주기]

동글하다 2023. 8. 8. 15:38

Why?

memo app을 따라 만들어 보며 메모를 삭제하였을 때 하단의 메모 개수가 변경되지 않는 문제가 발생한 적이 있다

이러한 문제를 해결하는 과정으로는 해당 뷰의 viewWillAppear 메서드에 tableview와 collectionview, toolbar를

업데이트 및 다시 할당을 하니 문제를 해결 할 수 있었다.

그렇기에 viewWillAppear 메서드는 무엇이며 UIViewController에 어떠한 메서드와 프로퍼티가 있는지 확인해 봐야겠다는

생각이 들었다.

    override func viewWillAppear(_ animated: Bool) { // 화면이 새롭게 그려질 때마다 호출됨
        myTableView.reloadData()
        myCollectionView.reloadData()
        self.toolbarItems = makeToolbarItems()
        dataManager.setData()
    }

TIL

1. UIViewController의 선언

먼저 Jump to Definition 을 통해 UIViewController를 살펴보자

@available(iOS 2.0, *)
@MainActor open class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment

선언부를 보니 생소한 키워드 들이 몇 가지가 보인다. 그 용어들부터 정리해 보자

    • @available(iOS 2.0, *)
      • 함수, 클래스, 프로토콜 앞에 사용 타입 또는 프로토콜이 적용되는 플랫폼 및 OS를 나타낸다
      •  #available과 다르게, 컴파일타임에 경고 또는 오류를 생성합니다. ->컴파일 시 버전이 안 맞다는 오류 메시지 같은 거!
    • @MainActor
      • 실행기가 메인 디스패치 큐와 동등한 싱글톤 관여자라는 뜻

 

그럼 UIViewController는 iOS 2.0 버전부터 사용이 가능하며 실행기가 메인 디스패치 큐와 동등한 싱글톤이라는 뜻이다

(-실행기가 메인 디스패치 큐와 동등한 싱글톤 관여자에 관한 부분은 따로 공부가 필요할 것 같다.)

그리고 UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment

이러한 것들을 상속 혹은 채택하고 있다.

 

2. 내부의 프로퍼티

나중에 사용하게 될 것 같은 프로퍼티만을 정리해 보자

    open var view: UIView!
    // 자주 사용하는 기본 뷰
    open var viewIfLoaded: UIView? { get }
    //뷰 컨트롤러의 뷰 또는 뷰가 아직 로드되지 않은 경우 nil
    @available(iOS 3.0, *)
    open var isViewLoaded: Bool { get }
    //뷰가 로드 되었는지의 Bool값
    open var nibBundle: Bundle? { get }
    //뷰 컨트롤러의 nib 파일(지정된 경우)의 이름 지정하지 않아도 무언가 나오긴 함?
    //ex) Optional("BYZ-38-t0r-view-8bC-Xf-vdC")
    @available(iOS 5.0, *)
    open var storyboard: UIStoryboard? { get }
    //뷰 컨트롤러가 시작된 스토리보드입니다.
    open var title: String?
    이 컨트롤러가 관리하는 title을 나타내는 문자열입니다.
    weak open var parent: UIViewController? { get }
    // 이 컨트롤러의 상위 뷰를 보는 것

 

3.  ViewController의 Life Cycle

loadView

view controller가 관리하는 view를 만든다

loadView가 뷰를 만들고, 메모리에 올린 후에 viewDidLoad가 호출

이 메서드를 직접 호출하면 안 됨 (self.loadView() X, super.loadView() O)

view controller에 관련 nib 파일이 있는 경우 nib 파일에서 view를 로드

view controller에 연결된 nib 파일이 없으면 대신 일반 개체 만듦

viewDidLoad

호출 시점: view controller가 메모리에 로드되고 난 후

view의 로딩이 완료되었을 때 시스템에 의해 자동으로 호출되기 때문에

일반적으로 리소스를 초기화하거나 초기 화면을 구성하는 용도로 주로 사용

viewWillAppear

호출 시점: view가 view 계층 구조에 추가되기 전과 view를 표시하기 위해 애니메이션이 구성되기 전

view가 나타나기 직전에 호출

view에 나타내는 것과 관련된 작업을 수행할 때 사용

viewDidAppear

호출 시점: view가 화면에 나타난 직후에 실행

view가 나타났다는 것을 controller에게 알리는 역할

화면에 적용될 애니메이션을 그려줌

viewWillDisappear

호출 시점:  view 계층 구조에서 view가 제거될 때

view가 실제로 제거되기 전과 애니메이션이 구성되기 전에 호출

viewDidDisappear

호출 시점: view 계층 구조에서 view가 제거되었음을 view controller에 알림

 


Reference

https://tono18.tistory.com/11

https://subscription.packtpub.com/book/mobile/9781783550814/6/ch06lvl1sec60/uiviewcontroller-lifecycle-methods

https://developer.apple.com/documentation/swift/mainactor