본문 바로가기

iOS

[iOS]ViewController의 특징과 ViewLifeCycle

Responsibility (뷰컨트롤러의 책임)

- 주요한 데이터의 변화에 응답으로 뷰들의 컨텐트들을 업데이트 한다.

- 뷰들과 함께 사용자와의 대화에 응답한다. - 이벤트 핸들링

- 뷰들의 사이즈 재조정과 전반적인 인터페이스의 레이아웃을 관리한다.

- 다른 객체(뷰컨트롤러 등)들과 함께 앱을 구성한다.

 

ViewController Type

뷰 컨트롤러는 두 가지 타입이 존재한다.

- 일반적으로 흔히 보는 인터페이스 빌더로 생성시 기본으로 생성되는 VIewController는 Content View Controller에 해당한다.

- NavigationViewController / TabBarViewController 처럼 여러 개의 View Controller를 제어하는 뷰 컨트롤러도 존재하는 데 이들이 ContrainerViewController 타입이다.

 

- Content view controller

  - 앱의 컨텐트의 일부분을 관리하는 뷰 컨트롤러

  - 자신의 모든 뷰들을 스스로 관리한다. 

- Container view controller

  - 다른 뷰 컨트롤러들로 부터 정보를 모은다.

  - 자신의 뷰들과 자신의 자식 뷰 컨트롤러들의 root view들을 관리한다.

  - 직접 자식 뷰 컨트롤러의 컨텐츠를 관리하지는 않고 root  view의 크기조절과 위치조절에 대해서만 관리한다.

 

Life Cycle Method

- 뷰 컨트롤러에는 생명주기가 존재한다.

- 뷰 컨트롤러간에는 전환이 존재한다.

- 전환은 되지만 이전 뷰 컨트롤러의 뷰가 유지되는 경우도 있고, 아닌 경우도 존재한다.

- 또 전환될 뷰 컨트롤러에서 이전 뷰 컨트롤러의 정보를 이어 받아서 작업을 해야하는 경우도 빈번하다.

- 이를 위해 그 해당시점을 이벤트화 해두어서 그 시점에서 해야할 동작을 지정해둘 수 있다.

 

+

- 뷰 컨트롤러는 데이터 객체와 뷰 사이의 중개자이다.

- 뷰 컨트롤러와 모델(데이터 오브젝트)의 책임을 깔끔하게 분리하는 걸 유지 해야한다.

- 뷰 컨트롤러는 Responder객체이고 Responder Chain에 연결된다. 따라서 view controller도 이벤트 핸들링을 할 수 있다.

- View Life Cycle

  Present - CurrentContext / FullScreen은 presentingViewController의 rootView를 뷰계층에서 제거한다.

  Present - OverCurrentContext / OverFullScreen은 presentingViewController의 rootView를 뷰계층에서 제거하지 않는다. 

 

0.init

스토리보드나 nib(xib)파일을 통해 뷰컨트롤러를 초기화합니다. 이 과정은 뷰를 만들 때 사용할 정보를 뷰 컨트롤러에 저장하는 단계입니다.

 

1. loadView

뷰를 실제로 생성해서 메모리에 로드합니다. 스토리보드나 nib(xib)을 사용하지 않는다면 이 메소드를 오버라이드해서 뷰를 만들고 뷰계층을 구성해야 합니다.

 

NIB (Next Interface Builder)(with Storyboard)

- 이 메소드를 절대 직접 호출해선  안된다.

- 뷰 프로퍼티가 요청될 때 뷰 컨트롤러가 이 메소드를 호출한다.

- 뷰 컨트롤러가 nib 파일과 연관되어 있을 때 이 메소드는 뷰를 로드한다.

- .Nib 파일과 연관되어잇지 않을 경우 이 메소드는 플레인한 UIView 객체로 생성한다.

 

Manually creating Views(without Storyboard)

- 직접 뷰를 작성하여 생성했을 경우 이 메소드를 오버라이드할 수 있다.

- 이 방법을 사용할 경우 생성한 뷰-계층 루트 뷰에 할당해라.

- 직접 생성한 뷰 인스턴스는 고유해야하며 다른 뷰 컨트롤러와 공유되어선 안된다. (재사용을 위한 코드라인이 아니라 인스턴스)

- 이 메소드 안에서 super를 호출해선 안된다.

- 추가적인 Initialization을 수행하려는 경우 viewDidLoad() 메소드를 사용할 것

 

2. viewDidLoad

- 이 메소드는 뷰 컨트롤러가 자신의 뷰-계층을 메모리에 로드한 후에 호출된다.

- 이 메소드는 뷰계층이 nib파일을 통해 로드 됐건, loadView()에서 Programmatically하게 생성되어 로드됐건 호출된다.

- 뷰들이 로드된 후 추가적인 Initialization을 수행하려는 경우에 사용한다.

- 뷰나 뷰컨트롤러에 대한 추가적인 설정을 해줍니다.

 

3. viewWillAppear

- 뷰 컨트롤러의 뷰가 뷰-계층에 추가되기 전과 뷰를 위한 어떤 애니메이션이 형성되기 전에 호출된다.

- func viewWillAppear(_ animated: Bool) True가 할당될 경우 뷰가 window에 추가될 때에 애니메이션을 사용한다.

- 뷰를 디스플레이하는 것과 연관된 암무를 수행할 경우 이 메소드에 오버라이드하여 사용한다.

- 이 메소드를 오버라이드하여 사용할 경우 super를 호출해야 한다.

- 뷰가 화면에 나타나기 전에 필요한 추가적인 작업(예: 다른 뷰를 조정하는 작업)을 수행할 수 있습니다.

 

4. viewWillLayoutSubviews

- 뷰의 bounds가 변화될 때, 뷰는 서브뷰들의 위치를 적용한다. 그 전에 이 메소드가 호출된다.

- View의 서브뷰들의 layout이 적용되기 전에 변화를 주려는 상황에 오버라이드하여 사용할 수 있다.

- 이 메소드의 디폴트는 아무런 수행도 하지 않는다.

 

5. viewdidLayoutSubviews

- 뷰의 bounds가 변화될 때, 뷰는 서브뷰들의 위치를 적용한다. 그 이후에 이 메소드가 호출된다.

- View의 서브뷰들의 layout이 적용된 후에 변화를 주려는 상황에 오버라이드하여 사용할 수 있다.

- 이 메소드의 디폴트는 아무런 수행도 하지 않는다.

 

6. viewDidAppear

- 뷰의 Presenting과 연관된 추가적 임무를 수행하려는 경우 이 메소드를 오버라이드한다.

- 이 메소드를 오버라이드하여 사용할 경우 super를 호출해야 한다.

- 뷰 컨트롤러가 다른 뷰 컨트롤러 안에서 Presenting될 경우, 이 메소드는 Presented된 뷰 컨트롤러가 Dismissed된 후 Presenting된 뷰 컨트롤러에서 행사된다.

- 뷰에 대한 추가적인 설정을 해줄 수 있습니다.

 

7. viewWillDisappear

- (animated:true)일 경우, View의 disappearance시 애니메이션이 적용된다.

- 이 메소드는 뷰가 제거되기 전, 그리고 애니메이션이 적용되기 전에 호출된다.

- 이 메소드를 오버라이드하여 사용할 경우 super를 호출해야 한다.

- 해당 뷰를 통해 일어난 변화를 저장하거나, 최초 반응자 상태를 내려놓거나, 뷰가 나타났을 때 조정됐던 다른 뷰들을 원래대로 돌려놓는 등의 작업을 수행할 수 있습니다.

 

8. viewDidDisappear

- 뷰가 뷰 계층에서 제거된 이후에 호출됩니다.

- 뷰의 dismissing과 hiding 연관된 추가적 임무를 수행할 때 오버라이드하여 사용할 수 있다.

- 이 메소드를 오버라이드하여 사용할 경우 super를 호출해야 한다.

- 뷰가 사라질 때 필요한 추가 작업을 수행할 수 있습니다.

 

9. deinit

- Swift는 더 이상 필요하지 않은 인스턴스를 자동으로 반환한다.

- Swift는 인스턴스들의 메모리 관리를 ARC(Automatic Reference Counting)를 이용해 핸들링한다.

- 일반적으로 인스턴스들의 메모리 반환을 위해 매뉴얼한 클린업을 직접 수행하지 않아도 된다.

- 직접 만든 잔원들을 사용할 경우 추가적인 클린업을 수행해야 할 경우가 있을 수 있다. 만일 생성한 커스텀 클래스가 파일을 오픈하여 데이터 wirte을 수행한다면, 해당 클래스의 인스턴스가 메모리 반환되기 전 파일스트림을 직접 클로즈 해 주어야 하는 상황이 발생할 수 있다.

- 클래스 정의는 클래스당 최대 하나의 deinitializer를 갖을 수 있다.

- deinitializer는 어떤 파라미터도 받지 않으며 괄호()가 없다.

- deinitializer는 인스턴스가 반환되기 전 자동으로 호출된다.

- deinitializer를 직접 호출하는 것은 허용되지 않는다.

- 슈퍼클래스의 deinitializer는 서브클래스에 의해 상속되며 슈퍼클래스의 deinitializer는 서브클래스가 deinitializer를 제공하지 않더라도 항상 호출된다.

- deinitializer가 호출되기 전 까지는 인스턴스가 반환되지 않기 때문에 반환전 인스턴스의 모든 프로퍼티에서 접근하여, 추가적인 수행을 할 수 있다. (파일매니저, 네트워킹 클로즈 등)

 

10. didReceiveMemoryWarning()

- App은 절대 이 메소드를 직접 호출하지 않는다.

- 이 메소드는 사용가능한 메모리 용량이 낮다고 시스템이 판단했을 때 호출된다.

- 추가적인 메모리 반환이 필요할 때 뷰컨트롤러에 오버라이드하여 사용할 수 있다.

- 이 메소드를 오버라이드하여 사용할 경우 super를 호출해야 한다.

- 해제 할 수 있는 메모리를 해제하여 최대한 메모리를 확보하는 작업을 수행합니다.

 

11. viewWillTransition(to:with)

- to size: 컨테이너뷰를 위한 새 사이즈

- with coordinator: 트랜지션 코디네이터 오브젝트 로 사이즈 변화를 관리한다, 이 오브젝트를 이용하여 애니메이션의 트랜지션 진행중인 정보를 가져오거나 변화를 줄 수 있다.

- 뷰 컨트롤러의 뷰의 사이즈가 변화되기 전 UIKit은 이 메소드를 호출한다.

- 오브젝트의 사이즈 변화와 연관된 추가적 임무를 수행하기 위해 이 메소드를 오버라이드 할 수 있다.

- 제공된 with coordinator를 이용하여 오브젝트 애니메이션에 변화를 줄 수 있다.

- 오버라이드 시 UIKit이 사이즈 변화를 적절하게 처리할 수 있도록 super를 호출해야 한다.

- 뷰 컨트롤러는 사이즈 변화 메시지를 자신의 뷰들과 자식 뷰컨트롤러에 전달한다.

- Presentation컨트롤러는 사이즈 변화를 Presented된 뷰 컨트롤러에게 전달해 처리한다.

 

'iOS' 카테고리의 다른 글

[iOS]Info.plist  (0) 2021.02.03
[iOS] view background pattern image  (0) 2021.02.01
[iOS]Label AttributedString 라벨 부분적으로 속성바꾸기  (0) 2021.01.26
[iOS] UILabel  (0) 2021.01.26
[iOS] UITabBarController와 UITabBar의 차이  (0) 2021.01.26