본문 바로가기

ios

1. UIViewController 공식문서 공부

UIViewController 한 줄 요약

UIKit app의 뷰 계층을 관리하는 객체

 

UIKit? 

- UI를 구현하기 위해 UIKit는 window와 view architecture등을 제공한다.

Window?

- 뷰들 가장 뒤에서 배경막 역할을한다.

- 뷰에 이벤트를 전달한다.

   - UIWindow는 UIView를 상속 받음

- 뷰들을 담는 컨테이너

View?

- 스위프트에선 UIView라는 클래스로 구현한다.

- label, imageView의 부모클래스이다. 

Architecture?

- 동작원리를 설명하는 설계도

 

UIResponder

  1. 사용자의 이벤트(터치, 모션, 리모컨 이벤트 등)에 대응하는 객체의 기본 인터페이스를 제공한다.
  2. 주요 특징과 역할
    1. 이벤트 처리
      1. UIResponder는 터치, 모션, 원격 제어와 같은 다양한 사용자 이벤트를 처리합니다.
      2. 예를 들어 사용자가 화면은 탭하거나 스와이프할 때, 이러한 행동은 UIResponder 객체를 통해 처리된다.
    2. 응답 체인(Responder Chain)
      1. UIResponder 객체들은 응답 체인을 형성하여, 이벤트 처리를 할 수 있는 적절한 객체로 이벤트를 전달합니다.
      2. 이 체인을 통해 이벤트는 최초 응답자에서 시작하여, 필요에 따라 상위 뷰나 뷰 컨트롤러로 전달된다.
    3. 서브 클래싱
      1. UIView, UIViewController, UIApplication등은 모두 UIResponder를 상속받아 이벤트에 반응할 수 있습니다.
      2. 개발자는 이 클래스들을 서브클래싱하여 사용자 이벤트에 대한 특정한 반응을 구현할 수 있습니다.
  3. 응답 체인 이해
    1. 응답 체인은 이벤트 처리의 핵심 개념이다.
    2. 예를 들어 특정뷰가 터치 이벤트를 처리할 수 없는 경우 이벤트는 그 뷰의 상위뷰로 전달된다.
    3. 이러한 방식으로 이벤트는 체인을 따라 적절한 응답자를 찾을 때 까지 계속 전달된다.

 

 

 

 

 

중요 메서드 와 프로퍼티

1. view를 관리

  1. var view:UIView! 
    1. 컨트롤러가 관리하는 뷰
  2. var viewIfLoaded : UIView?
    1. 뷰컨트롤러의 뷰, 아직 로드가 안되었으면 nil
  3. var isViewLoaded : Bool
    1. 메모리에 로드된 뷰인지 알려주는 불린 값
  4. func loadViewIfNeeded()
    1. 뷰컨트롤러의 뷰가 아직 로드되지 않았다면 로드된다.
  5. var preferredContentSize: CGSize
    1. 뷰 컨트롤러의 뷰의 선호하는 사이즈

 

 

 

 

 

 

 

 

2. 뷰와 관련된 이벤트에 응답

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

'ios' 카테고리의 다른 글