티스토리 뷰

iOS/Swift

ViewController와 LifeCycle - 2, LifeCycle

iOS 개발자, 였던 것 2023. 4. 18. 00:24

간단하게 Swift에서 정의하고 있는 ViewController와 여러 ViewController 중 핵심이었던

UIViewController를 알아보았던 지난 시간에 이어서, 오늘은 본격적으로 LifeCycle을 다뤄보려고 한다.


LifeCycle?

한글로 직역하면, 생명주기 되시겠다.

말 그대로 UIViewController가 만들어져, 보여지고, 사라지기까지의 과정들을 다루는 것인데

이를 Swift에서는 Handle view-related notifications라는 이름으로 관리를 하고 있다.

 

아래는 Handle view-related notifications의 설명이다.

When the visibility of its views changes, a view controller automatically calls its own methods so that subclasses can respond to the change. Use a method like viewWillAppear(_:) to prepare your views to appear onscreen, and use the viewWillDisappear(_:) to save changes or other state information. Use other methods to make appropriate changes.

즉, view들의 visibility가 변경되면 view controller가 가진 메소드들이 호출되어, 변경에 대한 응답을 할 수 있게 하는 것이다.

대표적으로 viewWillAppear와 viewWillDisapper가 있고 각각 뷰 컨트롤러가 보여지기 전, 사라지기 전에 호출 되므로 이때 필요한 작업들을 보통 선언해서 작업한다. 이전 ViewController에 데이터를 직접 전달해주는 경우에 대한 처리를 하거나 화면이 사라지기 전 해제할 것들을 처리했었던 기억이 있다.

 

- (void)viewWillAppear:(BOOL)animated;    
// Called when the view is about to made visible. Default does nothing

- (void)viewDidAppear:(BOOL)animated;     
// Called when the view has been fully transitioned onto the screen. Default does nothing

- (void)viewWillDisappear:(BOOL)animated; 
// Called when the view is dismissed, covered or otherwise hidden. Default does nothing

- (void)viewDidDisappear:(BOOL)animated;  
// Called after the view was dismissed, covered or otherwise hidden. Default does nothing

Xcode 상에서 각각 메소드들을 타고 들어가면, 위와 같은 Objective-C로 구현된 원형을 볼 수 있는데

각각의 메소드들은 기본적으로 아무것도 하지 않는 것을 원칙으로 한다. (tistory 코드블럭에서는 objective-c를 지원하지 않는다!)

 

  • viewWillAppear
    View를 보이게 만들 때 호출되는 메소드
    viewDidLoad 이후, 화면에 View가 보일 것임을 알려주는 메소드라고 생각하면 된다.
    생명 주기 상에서 한 번만 호출되는 viewDidLoad와 달리, 가려졌다가 다시 등장하는 등의 상황에도 호출이 된다!
    초기화 작업은 viewDidLoad, 화면이 다시 보여졌을 때 처리하고 싶은게 있다면 viewWillAppear에서!

  • viewDidAppear
    View가 완벽하게 전환되어 화면 상에 보여지게 되면 호출되는 메소드
    viewWillAppear 이후, View가 화면에 보여지고 나면 호출되는 메소드로 Screen내에 View가 보여지고 난 후에 호출이 되는 만큼, WillAppear보다는 직접 사용 하는 경우가 적었던 것으로 기억한다.

  • viewWillDisappear
    View가 사라지게 될 때, 덮이게 될 때, 다른 이유로 숨겨지게 될 때 호출되는 메소드
    '앞으로 뷰가 사라질 거에요' 라는 의미로 사용되는 메소드

  • viewDidDisappear
    View가 사라졌거나, 덮였거나 다른 이유로 숨겨졌을 때 호출되는 메소드
    '뷰가 사라졌습니다' 라는 의미로 사용되는 메소드로 호출 되었다면, 현재 해당 뷰를 볼 수 없는 상태라는 의미이다

지난 글 마지막에 등장한, UIViewController LifeCycle

일반적으로 위의 그림처럼 Appearing -> Appeared -> Disappearing -> Disappeared의 순서로 전환이 되지만, Appearing에서 직접적으로 Disappearing으로 전환되는 경우도 있다고 한다. 직접 전환되는 사례는 자세히 몰라, 추후 추가할 예정이다.

각각의 화면 전환 과정에서 앞서 설명한 메소드들이 호출되고 정의된 일들을 처리한다.

 

위의 네 메소드 외에도 ViewController 내에서는 다양한 일들이 일어나는데, 화면을 처음에 로드해주거나 레이아웃을 설정하는 등을 관리하는 viewDidLoad와 LayoutSubview와 관련된 메소드들이 있다.

- (void)viewDidLoad; 
// Called after the view has been loaded. 
// For view controllers created in code, this is after -loadView. 
// For view controllers unarchived from a nib, this is after the view is set.

- (void)loadView; 
// This is where subclasses should create their custom view hierarchy 
// if they aren't using a nib. Should never be called directly.

// Called just before the view controller's view's layoutSubviews method is invoked. 
// Subclasses can implement as necessary. The default is a no-op.
- (void)viewWillLayoutSubviews API_AVAILABLE(ios(5.0));

// Called just after the view controller's view's layoutSubviews method is invoked. 
// Subclasses can implement as necessary. The default is a no-op.
- (void)viewDidLayoutSubviews API_AVAILABLE(ios(5.0));
  • viewDidLoad
    View가 로드 되고 난 후에 호출되는 메소드로
    코드로 작성된 VC의 경우 loadView 이후 호출되고, nib에서 아카이브하지 않은 VC는 view가 설정된 후에 호출된다고 한다.
    메모리 상에 ViewController가 없는 경우에 호출된다고 생각하면 된다.
  • loadView
    서브 클래스들이 hierarchy를 구성하는 곳으로 직접 호출하지 않는 것을 권장한다.
    앞서 이야기 한 것처럼, 코드로 작성한 VC에서 viewDidLoad 이전에 호출되는 메소드이다.

  • viewWill/DidLayoutSubviews
    iOS 5.0 이후 사용된 메소드로, VC의 layoutSubviews 메소드 호출 이후 호출된다.
    하위 클래스에서는 필요하면 만들 수 있다고 한다.
    iPhone XR이 처음 나왔을 때 해당 메소드에서 깨진 UI관련 처리를 해줬던 기억이 있다.

이정도 까지 짚고가면, 실제로 많이 사용되는 메소드들과 전반적인 라이프 사이클에 대한 이해는 어느정도 된듯 하다.

정말 오래간만에 Swift Document들을 좀 찾아봤는데, 반갑기도 하고 즐거운 시간이었다.

 

작성하다 보니, 어느새 12시가 넘었다. 아직 문서 번역이 익숙하지 않아 작성하는데 꽤나 많은 시간이 걸린다. 익숙해지겠지..

 

부족한 글이지만, 읽어주셔서 감사합니다. 항상 잘못된 내용에 대한 지적은 감사히 받고 있습니다.

 

참고 문서, Xcode 14.2-14.3 기반의 문서를 보고 작성했습니다.

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

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

https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/index.html#//apple_ref/doc/uid/TP40007457

'iOS > Swift' 카테고리의 다른 글

Swift에서의 Class와 Struct  (0) 2023.04.27
Swift, Equatable?  (0) 2023.04.21
Swift, Set 톺아보기  (0) 2023.04.18
ViewController와 LifeCycle - 1, UIViewController  (0) 2023.04.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함