24.07.15 Today I Learned

2024. 7. 15. 20:39

UIViewController의 개념

 

UIKit 앱의 뷰 계층을 관리하는 개체

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

ViewController 생명주기

  • Ios의 대표적인 생명주기 2가지
    • 앱 생명주기 (App Lifecycle)
    • ViewController 생명주기 (ViewController Lifecycle)
  • ViewController Lifecycle

 

  • init : 앱에서 어떤 화면으로 진입할 때, ViewController은 이니셜라이저를 작동시켜 인스턴스를 생성한다. (생성자)
  • loadView : loadView는 ViewController의 인스턴스 프로퍼티인 view 객체를 메모리에 올린다. 이 과정에서 @IBOutlet, @IBAction 들이 생성되고 실제 view객체들과 자동으로 연결된다. 그리고 view 객체를 직접 코딩해서 만드는 경우가 아니면 절대 override를 하지 말라고 공식문서에 적혀 있다. 그리고 view와 함께 추가적으로 이니셜라이즈 해주고 싶은게 있다면 viewDidLoad 에서 하라고 나와있다.
  • viewDidLoad : 이 메서드가 호출되는 시점에서, 이미 view객체는 메모리에 다 올라와 있다. loadView 메서드가 작업을 완료했기 때문에, viewDidLoad가 호출됐다고 생각하면 쉽다. 그리고 viewDidLoad 메서드는 ViewController 전체 생명주기에서 딱 한 번만 호출된다. 즉, 사용자가 어떤 화면에 진입할 때, 뷰컨이 태어나고, 뒤로가기를 누르면 그 뷰컨은 죽는다.(메모리 할당 해제) 하지만 사용자가 다시 그 화면을 진입할 때 뷰컨은 다시 태어난다. 이처럼 처음 태어나거나, 혹은 죽고 다시 태어날 때만 호출되는게 viewDidLoad 메서드다. 사실 init, loadView 또한 생명주기 전체에서 한 번만 호출되는건 마찬가지다.

처음 ViewController를 만들면 default로 만들어져있는 상태

위 이미지를 보면 viewDidLoad 메서드에서는, 화면이 나타날 때 오직 한 번만 해주면 되는 작업을 넣어주면 좋다.

  • viewWillAppear : 이 메서드는 '미리 알림' 이라고 생각하면 쉽다. 화면이 사용자가 볼 수 있도록 등장할 예정일 때 메서드가 호출된다. 뷰 게층의 최상단부에 곧 화면이 추가될 것이라고 미리 알림을 보내는 것이다. 
  • viewDidAppear : '등장'이라고 이해하면 쉽다. 화면이 사용자에게 보여지도록 등장하고 나서 호출된다.
  • viewWillDisappear : 다음 화면으로 전환되기 전에, 지금 보고 있는 화면이 '사라질 예정' 이라는 걸 미리 알려주기 위해 호출된다. 이때, 사라진다는 건, 사용자의 눈에 보이지 않는다는 것이지 메모리에서 해제된다는 것은 아니다. 뷰 계층에서 맨 위에 있다가, 새로운 화면이 쌓이면서 한 칸 아래로 내려갈 예정이라는 뜻이다.
  • viewDidDisappear : 화면이 완전히 사라진 뒤에 이 메서드가 호출된다. 해당 뷰컨이 뷰 계층 구조 아래에 깔려 있게되므로 언제 이 화면으로 돌아올지 모르는 상태가 된 것이기 때문에 백그라운드에서 불필요한 작업이 있다면, viewDidDisappear 메서드를 override 해서 멈춰주면 좋다. 예를 들어, 사용자가 화면을 볼 수도 없는데 다른 뷰컨에서 notification을 받아서 화면을 새로고침 해줄 필요가 없다는 것이다.
// 뷰컨이 뷰 계층에 깔려서 보이지 않는다면, 화면을 refresh할 필요가 없다.

override func viewDidDisappear(_ animated: Bool) {
   super.viewDidDisappear(true)
   
   // notification 수신 중지
   // 새로고침 중지
}
  • deinit : View가 메모리에서 해제될 때 호출되는 메서드이다. (소멸자)
더보기

init()
storyborad를 통해 viewController를 만들 경우 객체가 생성될 때 초기화 하는 작업을 하는 메소드입니다.

loadView()
화면에 띄워질 View에 대한 데이터를 불러오는 메소드입니다.

viewDidLoad()
뷰의 컨트롤러가 메모리에 로드된 후에 호출됩니다.
viewDidLoad메소드는 뷰의 로딩이 완료 되었을 때 시스템에 의해 자동으로 호출되기 때문에 리소스를 초기화 하거나 초기화면을 구성하는 용도로 주로 사용합니다.

viewWillAppear()
viewWillAppear로 보면 뷰가 나타날것이다.
즉, 뷰가 나타나기 직전에 호출되는 메소드입니다.

viewDidAppear()
이것은 뷰가 나타났다.
즉, 뷰가 나타난 직후 호출되는 메소드입니다.

viewWillDisappear()
뷰가 사라지기 직전에 호출되는 메소드입니다.

viewDidDisappear()
뷰가 사라지고난 직후 호출되는 메소드입니다.

deinit()
뷰가 메모리에서 해제될 때 호출되는 메소드입니다.


숙련 과제 시작!

추가로 이제 테이블뷰로 전화번호부 목록을 만들어야 한다.

 

'Today I Learned > 2024' 카테고리의 다른 글

24.07.17 Today I Learned  (0) 2024.07.17
24.07.16 Today I Learned  (0) 2024.07.16
24.07.11 Today I Learned  (0) 2024.07.11
24.07.08 Today I Learned  (0) 2024.07.08
24.07.04 Today I Learned  (0) 2024.07.04

BELATED ARTICLES

more