UIViewController 한 줄 요약
UIKit app의 뷰 계층을 관리하는 객체
UIKit?
- UI를 구현하기 위해 UIKit는 window와 view architecture등을 제공한다.
Window?
- 뷰들 가장 뒤에서 배경막 역할을한다.
- 뷰에 이벤트를 전달한다.
- UIWindow는 UIView를 상속 받음
- 뷰들을 담는 컨테이너
View?
- 스위프트에선 UIView라는 클래스로 구현한다.
- label, imageView의 부모클래스이다.
Architecture?
- 동작원리를 설명하는 설계도
UIResponder
- 사용자의 이벤트(터치, 모션, 리모컨 이벤트 등)에 대응하는 객체의 기본 인터페이스를 제공한다.
- 주요 특징과 역할
- 이벤트 처리
- UIResponder는 터치, 모션, 원격 제어와 같은 다양한 사용자 이벤트를 처리합니다.
- 예를 들어 사용자가 화면은 탭하거나 스와이프할 때, 이러한 행동은 UIResponder 객체를 통해 처리된다.
- 응답 체인(Responder Chain)
- UIResponder 객체들은 응답 체인을 형성하여, 이벤트 처리를 할 수 있는 적절한 객체로 이벤트를 전달합니다.
- 이 체인을 통해 이벤트는 최초 응답자에서 시작하여, 필요에 따라 상위 뷰나 뷰 컨트롤러로 전달된다.
- 서브 클래싱
- UIView, UIViewController, UIApplication등은 모두 UIResponder를 상속받아 이벤트에 반응할 수 있습니다.
- 개발자는 이 클래스들을 서브클래싱하여 사용자 이벤트에 대한 특정한 반응을 구현할 수 있습니다.
- 이벤트 처리
- 응답 체인 이해
- 응답 체인은 이벤트 처리의 핵심 개념이다.
- 예를 들어 특정뷰가 터치 이벤트를 처리할 수 없는 경우 이벤트는 그 뷰의 상위뷰로 전달된다.
- 이러한 방식으로 이벤트는 체인을 따라 적절한 응답자를 찾을 때 까지 계속 전달된다.
중요 메서드 와 프로퍼티
1. view를 관리
- var view:UIView!
- 컨트롤러가 관리하는 뷰
- var viewIfLoaded : UIView?
- 뷰컨트롤러의 뷰, 아직 로드가 안되었으면 nil
- var isViewLoaded : Bool
- 메모리에 로드된 뷰인지 알려주는 불린 값
- func loadViewIfNeeded()
- 뷰컨트롤러의 뷰가 아직 로드되지 않았다면 로드된다.
- var preferredContentSize: CGSize
- 뷰 컨트롤러의 뷰의 선호하는 사이즈

2. 뷰와 관련된 이벤트에 응답
- loadView
- 이 메서드는 뷰 컨트롤러가 그의 뷰를 메모리에 로드할 때 호출된다.
- 대부분의 경우, 개발자가 직접 loadView를 호출하거나 오버라이드할 필요는 없다.
- loadView의 역할과 사용
- 뷰 생성
- loadView는 뷰 컨트롤러의 view 프로퍼티가 nil일 때 시스템에 의해 자동으로 호출된다.
- 기본 구현은 UIView 객체를 생성하고, 이를 뷰 컨트롤러의 view 프로퍼티에 할당합니다.
- 커스텀 뷰 로딩
- loadView를 오버라이드하여 커스텀 뷰 또는 뷰 계층을 직접 생성하고 설정할 수 있다.
- 이 경우 스토리보드나 NIB 파일을 사용하지 않고 코드로 UI를 구성하는 경우에 해당한다.
- 뷰 생성
- 주의 사항
- loadView에서 super.loadView()를 호출하지 마세요.
- 기본 구현이 새로운 뷰를 생성하고 view를 프로퍼티에 할당한다.
- super.loadView()를 호출하면 커스텀 뷰 설정이 덮어쓰여질 수 있다.
- 대부분의 경우, 스토리 보드나 NIB를 사용하여 UI를 구성하면 loadView를 직접 다룰 필요가 없습니다.
- loadView를 오버라이드하는 것은 주로 프로그래매틱 방식으로 UI를 구성할 때만 필요하다.
- viewDidLoad가 호출되기 전에 loadView가 실행되므로, loadView에서 UI요소를 초기화하고 설정할 수 있다.
- loadView에서 super.loadView()를 호출하지 마세요.
- func viewDidLoad()
- 컨트롤러의 뷰가 메모리에 로드된 후에 호출된다.
- 이 메서드는 뷰 컨트롤러의 생명주기 중 한번만 호출되며, 초기화 작업이나 필요한 설정을 수행하는 데 사용된다.
- 주요 사용 사례
- 초기 설정
- 뷰와 관련된 초기 설정 작업을 수행한다.
- 예를 들어, UI 컴포넌트의 초기 상태를 설정하거나 초기 데이터를 로드하는 등의 작업이 여기에 해당한다.
- 레이아웃 구성
- 뷰의 서브뷰를 추가하거나 레이아웃 관련 설정을 수행한다.
- 리소스할당
- 필요한 리소스(예: 네트워크 요청, 데이터 베이스 연결 등)를 설정합니다.
- 옵저버 및 노티피케이션 설정
- 특정 이벤트나 상태변화를 감지하기 위한 옵저버를 등록한다.
- 초기 설정
- 주의사항
- viewDidLoad 에서는 뷰의 크기나 레이아웃이 최종적으로 결정되지 않았을 수 있으므로, 크기나 레이아웃에 의존하는 작업은 viewWillAppear 또는 viewDidAppear에서 수행하는 것이 좋습니다.
- 한번만 실행되므로 뷰가 여러번 표시되더라도 반복적으로 실행될 필요가 없는 초기화 코드에 적합하다.
- super.ViewDidLoad() 필수
- func viewWillAppear
- 뷰 컨트롤러의 루트뷰가 뷰계층(뷰컨트롤러 안의 뷰들의 계층적 구조)에 추가될 예정이라는 것을 뷰 컨트롤러에게 알린다.
- 뷰가 화면에 나타나기 전에 필요한 업데이트나 변경 사항을 적용할 수 있는 기회를 제공합니다.
- 주요 사용 사례
- 데이터 갱신
- 화면에 표시되기 전에 데이터를 새로고침하거나 업데이트할 때 사용된다.
- 예를 들어, 사용자가 다른 탭으로 이동했다가 다시 돌아올 때 최신정보를 표시하고 싶을 때 사용한다.
- UI 업데이트
- 뷰의 레이아웃이 변경되었거나, 다른 뷰 컨트롤러에서 돌아올 때 UI를 업데이트하는데 사용한다.
- 네비게이션 및 상태바 스타일 변경
- 상태바의 스타일이나 네비게이션 바의 속성을 변경할 때 사용된다.
- 리소스 준비
- 오디오 재생, 애니메이션 등 뷰가 나타나기 전에 필요한 리소스를 준비하는 데 사용된다.
- 데이터 갱신
- 주의할 점
- super.viewWillAppear(animated)를 호출해야한다.
- viewWillAppear은 뷰가 실제로 화면에 나타나기 전에 호출되므로 뷰의 크기나 레이아웃이 최종적으로 결정되지 않을 수 있습니다. 레이아웃 관련 작업은 viewDidLayoutSubviews에서 수행하는 것이 적절할 수 있습니다.
- viewDidLayoutSubviews
- 뷰 컨트롤러의 뷰(루트뷰) 하위 뷰들의 레이아웃 배치를 마친 후에 호출된다.
- viewDidLayoutSubviews
- viewWillAppear은 뷰 컨트롤러가 뷰 계층에 표시될 때 마다 호출되므로, 여러번 호출될 수 있다.
- viewDidAppear()
- 뷰가 뷰계층에 완전히 추가되고 화면에 표시된 직후에 호출된다.
- 이 메서드는 뷰가 사용자에게 보이는 순간에 필요한 작업을 수행하기에 적합하다.
- 주요 사용 사례
- 애니메이션 시작
- 화면 전환 애니메이션 또는 뷰 관련 애니메이션을 시작하는 데 사용한다.
- 리소스 사용
- 카메라, 오디오 재생등과 같이 리소스를 사용하는 작업을 시작할 때 사용한다.
- 데이터 로딩
- 사용자가 화면에 있을 때만 필요한 데이터를 로딩하는 경우에 사용된다.
- 이벤트 리스닝 시작
- 특정 이벤트를 감지하기 시작하는 로직을 여기에 배치할 수 있다.
- 애니메이션 시작
- 주의사항
- viewDidAppear은 뷰가 화면에 완전히 나타난 후에 호출된다. 뷰의 크기와 레이아웃이 최종적으로 결정된 상태이다. 이를 이용해 최종 레이아웃에 의존하는 작업을 수행할 수 있습니다.
- super.viewDidAppear(animated) 필수
- viewDidAppear은 뷰 컨트롤러가 뷰 계층에 표시될때마다 호출되므로, 여러번 호출될 수 있다.
- viewWillDisappear()
- 뷰 컨트롤러의 뷰가 뷰 계층에서 제거 되기 직전에 호출된다.
- 이 메서드는 뷰가 화면에서 사라지기 전에 필요한 정리 작업이나 업데이트를 수행하기에 적합하다.
- 주요 사용사례
- 리소스 해제
- 사용중인 리소스를 정리하거나 해제하는데 사용된다.
- 예를 들어 애니메이션을 중단하거나, 네트워크요청을 취소하는 등의 작업이 있다.
- 상태 저장
- 사용자가 화면을 떠나기 전에 현재 상태를 저장하는데 사용될 수 있다.
- 옵저버 제거
- 이벤트 리스너나 옵저버를 해제하는데 사용된다.
- 사용자 인터페이스 업데이트
- 화면이 사라지기 전에 UI 요소의 상태를 업데이트하거나 숨기는 작업을 수행한다.
- 리소스 해제
- 주의 사항
- super.viewWillDisappear(animated)를 호출하는 것이 중요하다.
- viewWillDisappear는 뷰가 뷰 계층에서 완전히 사라지기 전에 호출되므로 이시점에서 뷰의 크기와 레이아웃은 여전히 유효하다.
- viewWillDisappear는 뷰 컨트롤러가 뷰 계층에서 제거될 때 마다 호출되므로, 여러번 호출될 수 있습니다. 따라서 반복적으로 해야할 정리작업에 적합한 위치입니다.
- viewDidDisappear
- 뷰가 뷰 계층에서 완전히 사라진 후에 호출됩니다.
- 이 메서드는 뷰가 화면에서 완전히 사라진 직후에 수행해야하는 작업을 처리하기에 적합합니다.
- 주요 사용 사례
- 옵저버 및 리스너 해제
- 다음 화면으로의 전환 또는 뷰 컨트롤러 간의 데이터 전달과 관련된 작업을 수행합니다.
- 주의 사항
- super.viewDidDisappear(animated)를 호출하는 것이 중요하다.
- 이 메서드가 호출될 때는 뷰가 더이상 화면에 표시되지 않는다.
- viewDidDisappear는 뷰 컨트롤러가 뷰 계층에서 제거될 때마다 호출되므로, 여러 번 호출될 수 있습니다. 따라서 반복적으로 해야 할 정리 작업에 적합한 위치입니다.
- viewDidUnload
- ios 6 이후로는 viewDidUnlaod와 관련된 메커니즘이 제거 되었다.
'ios' 카테고리의 다른 글
6. ios videoLab에 대한 문서 공부 (0) | 2023.11.14 |
---|---|
5. Swift Concurrency (0) | 2023.10.09 |
4. iOS13 AppDelegate, SceneDelegate의 역할 (0) | 2023.09.14 |
3. WKWebView 공식문서 공부 2편 (0) | 2023.09.12 |
2. WKWebView 공식문서 공부 1편 (0) | 2023.09.08 |