일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jQuery
- Xib
- 계산기앱
- Swift
- 개발기록
- 자바스크립트
- 스프링
- iOS배포
- FileOwner
- iOS계산기
- Python
- MainScheduler
- 웹
- 딩동말씀
- 앱배포
- DispatchGroup
- ios
- FLASK
- 스위프트
- customclass
- 파이썬서버
- 앱버전구하기
- 계산기앱만들기
- spring
- AJAX
- subscript
- Xcode
- JavaScript
- iOS앱배포
- 맥
- Today
- Total
개발하는 뚝딱이
[iOS] 뷰 컨트롤러 본문
UIViewController
정의
class UIViewController : UIResponder
개요
UIViewController 클래스는 모든 뷰 컨트롤러가 공통으로 갖고 있는 속성을 정의합니다. 사용자가 UIViewController를 직접 생성하는 것은 거의 드물고, 대신에 UIViewController에 하위클래스를 두고 메서드나 프로퍼티를 추가할 수 있습니다.
뷰 컨트롤러의 주요 역할
- 데이터가 변하면 뷰의 컨텐츠도 업데이트 시켜주기
- 뷰에서 user interaction에 따라 반응하기
- 뷰의 크기를 조정하고 전반적인 인터페이스의 레이아웃 관리하기
- 앱의 다른 객체(다른 뷰 컨트롤러 포함)들과 조정하기
뷰 컨트롤러는 자신이 관리하는 뷰와 묶여져 있고 해당 뷰 계층에서 이벤트를 핸들링한는 역할을 담당하고 있습니다. 특히, 뷰 컨트롤러는 UIResponder이며 루트 뷰의 뷰 컨트롤러와 해당 뷰의 상위 뷰 사이의 응답자 체인에 추가됩니다. 뷰 컨트롤러는 이벤트를 처리하지 않았을 경우, 핸들링하거나 상위뷰에 전달해야 합니다.
뷰 컨트롤러는 거의 단독으로 쓰이지 않습니다. 대신 여러 개의 뷰 컨트롤러를 사용하고, 각각의 컨트롤러는 앱 UI의 일부분을 담당합니다. 예를 들어, 한 뷰 컨트롤러가 테이블을 보여주면 다른 뷰 컨트롤러는 테이블에서 선택된 셀 아이템을 보여주는 것처럼 말이죠. 한 개의 뷰 컨트롤러에서 항상 하나의 뷰만 보여집니다.
모든 앱은 최소한 UIViewController의 커스텀 하위클래스를 가지며 보통은, 여러 개의 커스텀 뷰 컨트롤러를 가집니다. 커스텀 뷰 컨트롤러는 앱 화면의 구성요소들과 user interaction에 어떻게 반응해야하는지 전반적인 동작들을 정의합니다.
뷰의 관리
각 뷰 컨트롤러는 뷰 계층구조를 관리합니다. 루트 뷰는 기본적으로 다른 뷰 계층구조의 컨테이너 역할을 합니다. 루트 뷰의 사이즈와 위치는 상위 뷰 컨트롤러나 앱의 윈도우인 루트 뷰를 갖고 있는 객체에 의해 결정됩니다. 윈도우가 소유한 뷰 컨트롤러는 앱의 루트 뷰 컨트롤러이며 사이즈는 윈도우에 맞게 조정됩니다.
뷰 컨트롤러는 뷰를 나중에 (lazily) 로드합니다. 처음으로 뷰 프로퍼티에 접근하면 뷰가 로드되거나 생성합니다. 뷰를 지정하는 방법에는 여러 가지가 있습니다.
1. 스토리보드에서 뷰 컨트롤러와 뷰를 지정합니다. 스토리보드에서 뷰와 뷰 컨트롤러를 연결할 수 있습니다. 또한 뷰 컨트롤러 간에 관계(relationship)과 세그를 지정할 수 있습니다. 스토리보드에서 뷰 컨트롤러를 로드하기 위해, UIStoryboard 객체인 instantiateViewController(withIdentifier:) 메서드를 호출해야 합니다.
2. Nib file을 이용하여 뷰 컨트롤러의 뷰를 지정합니다. nil 파일에서, 싱글 뷰 컨트롤러의 뷰를 지정할 수 있지만 세그나 관계를 지정할 수는 없습니다. nil 파일은 뷰 컨트롤러 자체의 최소한의 정보만 저장할 수 있습니다. nil file을 이용하여 뷰 컨트롤러를 초기화하기 위해서, 뷰 컨트롤러 클래스를 코드로 만들어주고 init(nibName:bundle:) 메서드를 사용해야 합니다. 뷰가 요청될 때만 뷰 컨트롤러는 nil 파일에서 뷰를 로드합니다.
3. loadView()를 이용하여 뷰 컨트롤러의 뷰를 지정합니다. loadView() 메서드에서 뷰의 계층구조를 코드로 생성하고 뷰 컨트롤러의 뷰 프로퍼티에 루트 뷰를 할당합니다.
뷰 컨트롤러는 해당 뷰와 하위 뷰를 단독으로 소유하고 있습니다. 뷰 컨트롤러는 자신이 메모리에서 해제되거나 할 때와 같이, 적절한 때에 뷰를 소유하고 있는 것을 포기하거나 또는 생성해야 합니다. 스토리보드나 nib 파일을 이용하면, 각 뷰 컨트롤러 객체는 자동으로 해당 뷰의 복사본을 갖습니다. 하지만 뷰를 직접 생성했다면, 각 뷰 컨트롤러는 자신의 뷰 세트를 가져야 합니다. 뷰 컨트롤러 사이에서는 뷰를 공유할 수 없습니다.
뷰 컨트롤러의 루트 뷰는 할당된 공간에 딱 맞게 사이즈를 갖습니다. 뷰 계층구조의 다른 뷰에서는, Auto Layout 제약조건을 통해 뷰의 위치와 사이즈를 상위뷰의 바운드 (bounds)에 맞게 조정됩니다.
View-Related Notifications 처리하기
뷰의 상태변화가 생길 때, 뷰 컨트롤러는 자동으로 메서드를 불러서 하위 클래스가 그 변화에 응답할 수 있도록 합니다.
viewWillAppear(_:) 뷰가 계층구조에 추가되기 직전에
viewDidAppear(_:) 뷰가 계층구조에 추가된 후
viewWillDisappear(_:) 뷰가 계층구조에서 삭제되기 직전에
viewDidDisappear(_:) 뷰가 계층구조에 삭제된 후
'iOS' 카테고리의 다른 글
기억 안날 때를 대비한 링크 모음 (0) | 2020.10.12 |
---|---|
[iOS] Core Graphic 기본 용어 정리 (0) | 2020.05.15 |
[ios/xcode] xcode에서 위치 사용하기 (0) | 2020.04.17 |
[iOS] 델리게이트 Delegate (0) | 2020.04.05 |
[iOS] View Programming 뷰 프로그래밍 (0) | 2020.03.19 |