티스토리 뷰

iOS/iOS-Memo

UIViewController, View-Life-Cycle

malrang-malrang 2022. 3. 2. 19:57

UIViewController

UIKit 앱의 뷰 계층 구조를 관리하는 객체

UIViewController 의 class는 모든 View Controller 의 공통적인 공유 동작을 정의한다.
클래스의 인스턴스를 직접 만드는 경우는 거의 없다.
대신 뷰 컨트롤러의 뷰 계층 구조를 관리하는 데 필요한 메서드와 속성을 하위 클래스로 만들고 추가한다.

뷰 컨트롤러의 주요 역할

  • 데이터가 변경되면 View의 화면을 변경된 값으로 업데이트한다.
  • View 를 통해 사용자와 상호작용에 응답한다.
  • View 에 표시될 컴포넌트? 등의 크기, 전체 인터페이스 레이아웃 관리
  • 앱내에서 다른 View Controller 와 다른 객체의 관계를 조정한다.

ViewController 는 관리하는 View 에 밀접하게 연결되어 있으며 View 계층 구조에서 이벤트 발생시 이벤트 처리에 참여합니다.
ViewController 는 UIResponder 객체이다.
ViewController 는 이벤트 처리에 관여해야 하므로 이벤트를 처리하거나, 부모 뷰 에 전달하는 옵션을 사용할수 있다.

ViewController 는 단독으로 사용되는 경우는 많지 않다.
대신 각각의 ViewController(전체 인터페이스 중의 일부) 를 소유하게 만들어 사용하는 경우가 많다.

예를 들면 ViewController, ViewController2 가있다면 ViewController2 는 앱내부의 화면중 한 화면을 담당하며 그 화면에서 일어나는 이벤트를 처리하거나 부모뷰에서 처리할수 있도록 하는 기능을 넣어줄수 있다.

View 관리

  • rootView
    • ViewController 는 View의 계층 구조를 관리하며 rootView 는 View 의 class 속성에 저장된다.
    • rootView 는 View stack 의 구조에서 최하위 라고 할수있다.
      이때 최상위 View 는 현재 앱에서 보여지는 화면을 의미한다.
  • storyBoard 에서 ViewController 와 class 를 연결하여 사용 할수있다.
    • 그리하여 storyBoard 를 사용해 ViewController 를 조작하거나 코드를 이용하여 조작할수 있게된다.
    • 코드 화면에서 뷰컨트롤러 를 조작하려면 메서드를 이용해 뷰컨트롤러 를 로드할수 있다.instantiateViewController(withIdentifier:)UIStoryboard
      withIdentifier 는 storyBoard 에서 해당 뷰컨트롤러의 ID 를 뜻하며 동일한 ID를 메서드 파라미터에 작성해주면 된다.
  • Nib 파일 을 사용하는 방법.
    • nib 파일을 사용하여 ViewController 에 연결된 View 만을 조작할수있다.
    • 이때 다른 View 와 segue 또는 관계를 정의할수 없다.

View Controller의 생명주기(Life-Cycle)

View Controller 에도 함수처럼 Life-Cycle 이 존재한다.
앱의 화면이 보여졌다 사라졌다 를 의미하는것 같다.

각각의 뷰는 각자 생명주기를 가지고 있다.

위의 그림은 View의 Life-Cycle 이다.
이때 Will은 미래, Did는 과거를 나타낸다.
하나씩 풀어보자면

  • viewDidLoad(뷰가 로드 되기전)
  • viewWillAppear(뷰가 나타나기 전)
  • viewDidAppear(뷰가 나타난 후)
  • viewWillDisappear(뷰가 사라지기 전)
  • viewDidDisappear(뷰가 사라진 후)

1. viewDidLoad(뷰가 로드 되기전)

  • "Called after the controller's view is loaded into memory"(뷰의 컨트롤러가 메모리에 로드되고 난 후에 호출된다.)
  • 뷰의 로딩이 완료 되었을 때 시스템에 의해 자동 으로 호출되기 떄문에 리소스를 초기화 하거나 초기 화면을 구성하는 용도로 주로 사용된다.
  • 화면이 처음 만들어질때 한 번만 실행됨
  • 처음 한번만 초기화 되어야 하는 코드가 있을 경우 이곳에 작성한다.2. viewWillAppear(뷰가 나타나기 전)
  • 뷰가 화면에 나타나기 직전에 호출된다 볼 수 있다.
  • viewDidLoad 와 viewWillAppear 는 둘다 화면이 나타나기 전에 호출되지만 차이점이있다.
  • 차이점은 viewDidLoad 는 호출되고나서 다른 뷰로 갔다가 다시 돌아오는 상황에서는 호출되지 않는다.
  • viewWillAppear 는 다른뷰로 갔다가 다시 돌아올때도 호출된다.
  • 그러므로 modal 등 화면을 이동했다 다시 돌아왔을때 변경사항이 적용되게끔 할때에는 viewWillAppear 를 사용할수 있겠다.3. viewDidAppear(뷰가 나타난 후)
  • 뷰가 화면에 나타난 직후 실행된다.
  • 뷰가 나타났다는 것을 컨트롤러에게 알리는 역할을 담당한다.
  • 화면에 적용될 에니메이션을 담당할수 있다.4. viewWillDisappear(뷰가 사라지기 전)
  • 뷰가 사라지기 직전에 호출되는 함수
  • 뷰가 삭제 되려고 하는것을 뷰 컨트롤러에 통지함.5. viewDidDisappear(뷰가 사라진 후)
  • 뷰 컨트롤러가 뷰가 제거되었음을 알려준다.

2개의 view에서 1view->2view 예시
1view: viewDidLoad(뷰가 로드된 후)
1view: viewWillAppear(뷰가 나타나기 전!)
1view: viewDidAppear(뷰가 나타난후!)
1view: viewWillDisappear(뷰가 사라지기 전)
2view: viewDidLoad(2번째 뷰가 로드된 후)
2view: viewWillAppear(2번째 뷰가 나타나기 전)
1view: viewDidDisappear(1번째 뷰가 사라진 후)
2view: viewDidAppear(2번째 뷰가 나타난 후)

예시 처럼 1번view 에서 2번view 로 전환 될때 일어나는 상황이다.
view 가 2개 이상 있을 때는
viewWillAppear 다음에 viewDidAppear 가 호출되는게 아니다!

2개의 view에서 1view->2view->1view 예시
2view: viewWillDisappear(2번째 뷰가 사라지기 전)
1view: viewWillAppear(1번째 뷰가 나타나기 전)
2view: viewDidDisappear(2번째 뷰가 사라진 후)
1view: viewDidAppear(1번째 뷰가 나타난 후)

예시 처럼 다시 1번 화면으로 돌아왔을때 1view 의 viewDidLoad 는 호출되지 않는다.

viewDidLoad 는 현재 네비게이션 컨트롤러의 rootView 이기 때문에 한번만 호출되기 때문에 다시 화면전환을 해도 viewDidLoad 는 호출되지 않는다.

2개의 view에서 1view->2view->1view->2view 예시
다시 2번view 로 이동하게되면 위의 설명과 다르게 이동할때마다 2view 의viewDidLoad 가 호출된다.

이유는 view 의 구조와 관계가 있다.
네비게이션 컨트롤러를 사용하게되면 stack 방식으로 저장되기 때문이다.

여기서 stack 은 LIFO(Last-in First-out)구조 로 되어있다.
네비게이션 컨트롤러는 반드시 root View Controller 를 갖게됨으로
예시의 첫번째 View 가 root View 가된다.

view 는 stack 처럼 쌓이는 구조 이므로 1View 위에 2View 가 쌓이는(push) 방식이다. 당연히push 가 있으니 pop(스택 제거?) 도 존재한다.

다시 예시로 돌아가면 1View 에서 2View로 push 되고 2View에서 1View로 전환될때는 2View 가 pop(제거) 됨으로 다시 2View 로 push 될때는 새로운 2View 가 stack 에 쌓이게 되므로 매번 viewDidLoad가 호출되게 된다.

6. loadView

그렇다면 loadView 의 역활은 무엇일까??
loadView 는 컨트롤러가 관리하는 뷰를 만드는 역할을 한다.
loadView 가 뷰를 만들고 메모리에 올린후 viewDidLoad 가 호출된다 할수있다.

아래의 코드는 UIViewController의 view 관련 메서드 중 어느 메서드 내부에 위치하는 것이 좋을지 생각해봅시다

  • 사용자 환영 애니메이션을 보여주는 코드(viewDidAppear)
  • 뷰에 보여질 데이터를 불러올 코드(viewWillAppear)
  • 배경음악을 재생할 코드(viewDidAppear)
  • 배경음악을 중지할 코드(viewDidDisappear)(유튜브로 실험해봤는데 찰나의 순간이라 화면이 사라진후인지 전인지 모르겠다....)
  • 노티피케이션 수신을 위한 옵저버 등록 코드(viewDidLoad)
  • 노티피케이션 수신 중단을 위한 구독 중단 코드(viewWillDisappear)(요녀석도 애매하다..)
  • 스토리보드로 구성한 뷰 요소의 초기값을 설정하는 코드(loadView)

참고
https://developer.apple.com/documentation/uikit/uiviewcontroller
https://zeddios.tistory.com/43

'iOS > iOS-Memo' 카테고리의 다른 글

Cache, NSCache, URLCache  (1) 2022.09.30
Underline SegmanetControl  (0) 2022.08.12
NotificationCenter, Modal 사용시 주의점!  (0) 2022.04.29
tag 사용법  (0) 2022.04.29
UserDefaults  (0) 2022.04.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함