개발하는 뚝딱이

[iOS] 뷰 컨트롤러 본문

iOS

[iOS] 뷰 컨트롤러

개발자뚝딱이 2020. 5. 13. 20:31

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(_:) 뷰가 계층구조에 삭제된 후