[TIL]뷰 컨트롤러의 뷰 관리

rbw·2022년 7월 24일
0

TIL

목록 보기
36/98
post-thumbnail

애플 공식 문서에서 필요한 부분 번역을 적으려고 합니당

ViewController로 뷰의 디스플레이와 관리에 대해

뷰 컨트롤러는 뷰 계층 구조와 뷰를 최신 상태로 유지하는 데 필요한 상태정보를 관리함다. 모든 UIKit 앱은 콘텐츠를 표시하기 위해 ViewController에 크게 의존하고, 뷰와 UI 관련 로직을 관리하기 위해 사용자 정의 VC를 자주 정의한다고 함다

UIViewController 는 뷰 속성에서 접근 가능한 콘텐츠 뷰가 포함되어 있어 뷰 계층의 루트뷰로 기능함다.

뷰컨트롤러의 초기화를 할 때, UIKit은 스토리보드의 모든 아울렛들을 재연결 함다. 그리고 이거는 뷰 컨트롤러의 viewDidLoad 메소드가 호출되기 전에 동작함다. 그래서, viewDidLoad 내부에서 아울렛으로 연결된 객체들에 액세스가 가능한거죠

뷰, 컨트롤에서 발생하는 이벤트 처리

컨트롤은 타겟-액션 디자인 패턴(버튼의 타겟을 생각하면 될 거 같은 느낌,,?)을 사용하여, 사용자 상호 작용을 보고하고, 일부 뷰는 알림을 띄우거나, 변경사항에 대한 응답으로 델리게이트 메소드를 호출함다.

VC는 뷰를 업데이트할 수 있게 이러한 상호작용 중 많은 부분에 대해 알아야 함다 ! 아래의 3가지 방법이 존재하니 살펴보겠슴다

  1. 뷰 컨트롤러에서 델리게이트 및 메소드를 구현, 이런 방법은 간단하고 구현하기 쉽지만, 유연성이 떨어지고 테스트가 어렵습니다. 코드도 좀 많이 길어 보일듯..!

  2. 델리게이트와 메소드를 뷰 컨트롤러 클래스 확장에서 구현함다. 이는 이벤트 핸들링 코드를 뷰 컨트롤러와 분리하고, 더 쉽게 테스트를 가능하게 함니당

  3. 관련 정보를 뷰 컨트롤러에 전달하는 전용 객체에 델리게이트와 메소드를 구현하는 방법이 있습니다. 이 방법이 제일 유연하고, 재사용성도 좋습니다. 책임을 분리하면 단위 테스트도 더 쉽게 작성이 가능함다 !

뷰를 스크린에 띄우는 준비

UIKit은 호면에 뷰컨트롤러와 뷰가 띄워지기 전에 여러 옵션을 제공해줍니당. 스토리보드에서 뷰 컨트롤러를 초기화 할 때, UIKit 은 init(coder:) 메서드를 사용해서 객체를 생섬함다.

만약 커스텀한 초기화가 필요하다면 UIStoryboardinstanceiateInitialViewController(creator:)메서드를 사용해서 코드로 뷰 컨트롤러를 초기화 가능합니다. 이 메소드는 뷰 컨트롤러를 블럭과 UIKit이 제공하는 코더 객체 사용으로 직접 만들 수 있슴다. 이 옵션을 사용하면 뷰 컨트롤러에 필요한 커스텀 데이터를 초기화하고 스토리보드의 다른 뷰 및 기ㅏㅌ 객체 구성을 복원 가능 함다.

화면에 뷰 컨트롤러를 띄울 때는 먼저 해당 뷰를 로드하고 구성해야 하며 다음 과정을 수행함다.

  1. 뷰의 init(coder:) 메서드를 사용하여 각 뷰를 만듬다
  2. 뷰를 뷰 컨트롤러의 아울렛과 액션에 연결함다
  3. 각 뷰와 뷰컨트롤러의 awakeFromNib()메서드를 호출함다
  4. 뷰 컨트롤러의 뷰 프로퍼티를 뷰 계층에 할당함다
  5. 뷰 컨트롤러의 viewDidLoad() 메서드를 호출합니당

뷰 컨트롤러가 화면에 나타날 때 마다 발생하는 작업을 수행하지 말라네여, 애니메이션이나 뷰의 값 업데이트 를 예시로 들었음다

UIKit은 뷰가 화면에 나타나려고 할 때 소유하는 뷰 컨트롤러에 알리고 다음 메서드를 순서대로 호출하여서 현재 환경에 맞게 해당 뷰의 레이아웃을 업데이트 합니당.

  1. 타겟 윈도우를 기반으로 뷰 컨트롤러의 특성 컬렉션을 업데이트 함다.
  2. viewWillAppear(_:) 메서드를 호출
  3. 필요한 경우 현재 레이아웃 여백을 업데이트하고 viewLayoutMarginsDidChange() 메소드를 호출
  4. 필요한 경우 안전영역 inset을 업데이트하고 viewSafeAreaInsetsDidChange()를 호출합니다.
  5. viewWillLayoutSubviews() 호출
  6. 뷰 계층 구조의 레이아웃을 업데이트한다.
  7. viewDidLayoutSubviews() 호출
  8. 화면에 뷰를 표시한다.
  9. 뷰 컨트롤러의 viewDidAppear(_:) 호출

만약 뷰 내부의 컨텐츠를 업데이트 하려면 viewWillAppear(_:) 메서드 내부에서 하라고 권장하고 있슴다. 그리고 많은 뷰의 컨텐츠를 바꾸는 것은 자동 레이아웃 업데이트가 트리거 되므로, 해당 방법을 변경하면 추가 레이아웃 단계를 피할 수 있슴다.

콘텐츠의 변경시 뷰 컨트롤러의 traitCollection 속성을 사용하여 디스플레이 크기 또는 수직 및 수평 크기 클래스와 같은 현재 환경에 대한 정보에 액세스할 수 있슴다.

traitCollection : 객체의 현재 환경을 설명하는 size 클래스, 배율 인수(scale factor) 같은 특성, 얘는 자신의 오브젝트에서 구현하지 말고 대신에 연결된 뷰, 뷰컨트롤러 또는 기타 객체의 traitCollection 프로퍼티를 사용하여 현재 사용 가능한 trait 정보를 확인하라고 함다.

viewWillAppear(_:) 보다 먼저 trait 에 접근이 가능하지만, 이는 마지막에도 같을지는 보장 되지 않슴당.


참조

https://developer.apple.com/documentation/uikit/view_controllers/displaying_and_managing_views_with_a_view_controller

profile
hi there 👋

0개의 댓글