UINavigationController, ViewController Life Cycle (LEDBoard)
LED
배울 기술
- UINavigationController
- 화면 전환 개념
- ViewController Life Cycle
- 화면간 데이터 전달 하는 방법
- 에셋 카탈로그
UINavigationController
- Content View Conroller : 화면을 구성하는 뷰를 직접 구현하고 관련된 이벤트를 처리하는 뷰 컨트롤러
- Container View Controller : 하나 이상의 Child View Conroller를 가지고 있다. 레이아웃하고, 화면 전환을 담당한다.
- 화면 구성과 이벤트 관리는 child view Controller에서 한다.
- 대표적으로 Navigation Controller 와 TabBar Controller가 있다.
계층 구조로 구성된 content를 순차적으로 보여주는 container view controller
Navigation Stack 을 가짐
Navigation Bar를 가짐. backItem ,topItem prompt, topItem Title, topItem rightBarButtonItem 등을 구성요소로 가진다.
화면 전환 개념
3가지 정도 사용됨.
- View Controller 에서 다른 View Controller를 호출하여 전환하기 (프레젠테이션 방법) → 비동기로 동작함 (화면을 덮고, 걷어내는 개념)
- Navigation Contoller 를 사용하여 화면 전환하기 ( stack 으로 push, pop 하는 방식)
- 화면 전환용 객체 세그웨이(Segueway)를 사용하여 화면 전환하기, strory board 이용 화면과 화면 사이에 SegueWay 객체를 둠
ViewContoller Life Cycle
- Appearing : 뷰가 화면에 나타나는 중
- Appeard: 뷰가 화면에 나타나는게 완료 된 상태
- Disappearing: 뷰가 화면에서 사라지는 중
- Disappeared: 뷰가 화면에서 사라진 상태
관련 메서드
viewDidLoad()
- 뷰 컨트롤러의 모든 뷰들이 메모리에 로드됐을 때 호출(메모리 처음 로드시 한번만 호출)
- 보통 딱 한번 호출될 행위들을 이 메소드 안에 정의 함
- 초기화나, 네트워크 호출등의 작업
viewWillAppear()
- 뷰가 뷰 계층에 추가 되고, 화면에 보이기 직전에 매 번 호출
- 다른 뷰로 이동했다가 다시 오면 다시 호출
- 뷰와 관련된 추가적인 초기화 작업을 여기서
viewDidAppear()
- 뷰가 뷰 계층의 추가된 후 호출
- 뷰를 나타낼때 필요한 추가 작업을 여기서(애니메이션 시작 작업 등..)
viewWillDisappear()
- 뷰 컨트롤러의 뷰가 뷰 계층에서 사라지기 전에 호출
- 작업한 내용을 되돌리거나, 데이터를 저장하는 작업
viewDidDisappear()
- 뷰 컨트롤러의 뷰가 뷰 계층에서 사라진 뒤에 호출
- 뷰가 사라지는 것과 관련된 추가 작업
화면간 데이터를 전달하는 방법
- viewController 프로퍼티를 생성하고 → viewContoroller를 인스턴스화 해서 사용하는 변수에 타입 케스팅을 한 다음 → 프로퍼티를 추가하는 형태로 데이터를 전달 할 수 있다.
- 반대로 뒤로 가기 할때나 pop 할때 전달하는 법 : delegate 패턴을 활용한다. (다른 객체에게 자신의 일을 위임하는 형태의 디자인 패턴)
- delegate 변수를 사용할때에는 week 키워드를 사용해서 강한 순환 참조를 막는다. → 데이터를 전달하는 곳에서 delegate 프로토콜을 만들고 전달받을 뷰에서 프로토콜을 준수하게 하면 전달하는 곳에서 메서드가 실행되게 할 수 있다.
- 리엑트에서 부모 요소에서 실행할 메서드를 자식에게 props로 전달해서 실행 시키는것과 비슷하다.
- 세그웨이를 사용할때에는 prepare 메서드를 사용해서 시스템에 의해서 호출될 수 있도록 해서 전달한다
에셋 카탈로그
Assets 폴더 안에 리소스를 추가할 수 있다. 리소스 추가 시에 1x 2x 3x 등의 크기에 이미지를 넣어주어야 하는데 이는 다양한 해상도의 깨지지 않는 이미지를 제공하기 위해서이다.
기타
- action 함수에서 sender 변수를 이용해서 어떤 인스턴스에서 발생한 액션인지 알 수 있다.