UIViewController

역할

  • 데이터의 변경에 대한 응답을 View에 Update한다.
  • View와 User와의 상호 작용에 응답한다.
  • View의 크기 조정 및 Layout 관리
  • 다른 객체(viewController 포함)를 조정한다.

간략하게, View와 밀접하게 연결되어 있다.

class UIViewController : UIResponder

또한, UIViewController는 UIResponder를 상속받았다. UIResponder에 대한 이야기는 밑에서 다시 할 것이다.

우선은 SuperView/SubViews 들과의 응답자 체인으로 엮여있다.
이것은 즉

1. 자신의 event의 처리를 SuperView에 passing할 수 있다.

2. 자신의 SubView들의 event를 자신이 처리할 수 있다.

가 가능하다.

 

대부분의 애플리케이션 내에는 여러개의 ViewController가 존재하고 사용된다.

어떤 VC(ViewController)는 리스트를 나타내는 테이블뷰 하나만을 관리할 수 있고,

다른 VC는 리스트, 회원창, 친구목록 등 다양한 View를 관리할 수 있다.

 

UIResponder

앞선 블로그 코코아 프레임워크에서 말했듯, 이 또한 클래스로 NSObject를 상속받는다.

class UIResponder : NSObject
  • Event 처리에 중요한 역할을 한다.
  • 여러 메소드와 next라는 프로퍼티를 사용하여 부모에게 event를 전달하거나, 동시 처리도 가능해진다.
    • touchesBegan
    • touchesMoved
    • touchesEnded
    • touchesCancelled
  • next라는 프로퍼티를 사용하여 다음 responder에게 이벤트를 전달 가능

responder 라고는 주로 becomeFirstResponder() / resignFirstResponder() 를 사용한 기억이 많다.

TextField를 사용하며 키보드를 올리고 내리고 하기 위해 사용해왔지만, 정확히 어떻게 동작하는 지에 대해서는 생각해보질 못했다.

키보드가 올라오기 위해서는 TextField가 window의 첫번째 Responder가 되어야 한다.

메소드이름 그대로 TextField가 첫번째 Responder가 되기 때문에, 키보드가 올라오며, 반대로 Resign하면 내려간다.

 

View 관리

  • 각 VC는 View들이 포함되는 RootView를 관리한다.
  • RootView는 주로 나머지 뷰 계층 구조에서 Container 역할을 한다.
  • VC의 View들은 lazy하게 메모리에 Load된다.
    • 선언한다고 메모리에 적재되는 것이 아닌, 사용할 때(즉, 호출될 때) 메모리에 적재된다.
    • VC 생성 시의 생명주기

StoryBoard를 사용할 때

스토리보드 내에서 1. VC로 사용할 View 와 2. VC 를 지정(연결)한다.

주로 간단한 화면 구조의 애플리케이션이나 혼자서 작업할 때 사용되는 방법이다.

// 스토리보드를 통한 VC 초기화
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "VC이름")

 

Nib  파일을 사용할 때

Nib파일을 사용하여 VC에 대한 View를 지정한다.

스토리보드를 사용하지 않기에, 스토리보드 내에서 가능했던 VC간의 Segue나 관계를 사용/정의할 수 없다.

초기화 방법 : init(nibName:bundle:)을 사용해서 초기화한다.

 

이후의 View들의 Load

VC의 생명주기 메소드들 중 가장 첫 단계인 loadView() 메소드를 사용하여 나열된다.

이후에 DidLoad, willAppear, DidAppear ... 

 

VC의 크기(RootView의 크기)

VC의 RootView는 항상 할당된 공간에 크기가 맞춰진다. 또한 RootView 내에 있는 SubView들은 Interface Builder를 사용하여 각 뷰와 SuperView와의 관계를 통해 크기, 위치 등이 지정된다.

 

구현 방식

1. AutoLayout - View 사이의 관계, 제약조건 등을 통하여 크기, 위치 등을 설정하며, 기기 크기에 대해 대응 가능

2. Frame - CGSize(크기), CGRect(위치)를 직접 할당한다.

 

 

View 관련 Notification

위에 사진으로 나타낸 VC의 생명주기의 메소드이름을 통해 View들이 어떤 상태인지를 알 수 있다.

반대로 말하면, View들의 현재 상태를 VC를 통해 알 수 있다.

 

기본 ViewController의 생명주기

  1. viewDidLoad
  2. viewWillAppear
  3. viewDidAppear
  4. viewWillDisappear
  5. viewDidDisappear

가 존재한다.

 

생명주기는 크게 Navigation Controller를 이용한 Push 와 Present 방식으로 나눠진다.

 

Push

A ViewController에서 B ViewController를 호출(즉, Push)한다고 하자.

  1. A에서 B를 호출 시 B(viewDidLoad)
  2. A(viewWillDisappear)
  3. B(viewwillAppear)
  4. A(viewDidDisappear)
  5. B(viewDidAppear)

B ViewController에서 pop한다고 하자

  1. B(viewWillDisAppear)
  2. A(viewWillAppear)
  3. B(viewDidDisappear)
  4. A(viewDidAppear)

Present

똑같이 A ViewController에서 B ViewController를 호출(즉, Present)한다고 하자.

  1. B(viewDidLoad)
  2. A(viewWillDisappear)
  3. B(viewWillAppear)
  4. B(viewDidAppear)
  5. A(viewDidDisappear)

B ViewController에서 dismiss한다고 하자

  1. B(viewWillDisappear)
  2. A(viewWillAppear)
  3. A(viewDidAppear)
  4. B(viewDidDisappear)

여기서 주의할 A의 viewDidLoad가 불리지 않았다!

또한 주의할 점은 Over 방식은 또 다르게 동작한다는 것이다. Over가 붙으면 현재 화면 위에 새로운 VC를 올린다고 생각하면 된다. 따라서 현재 화면은 사라지거나, 나타나거나 하지 않고 계속 상태가 유지되며 위에 올라오는 화면만 생명주기를 수행하게 된다.

 

 

 

View

  • 사용자와 상호작용을 할 수 있는 그림(?)이라고 생각하면 된다.
    • 당연히 그림만 가지고는 어떠한 동작이나 임무를 수행할 수 없다.
  • View가 사용자로부터 User Interation을 받으면 iOS 운영체제 커널 -> 이벤트 Queue -> VC의 순서로 이벤트가 전달된다.
    • 따라서 User와 Controller 사이에 연결을 담당하는 것이 View인 것이다.

ViewController

  • UIKit의 User Interface를 관리한다.
  • 한 개의 Application 내에는 1개 이상의 ViewController를 가지고 있다.

ViewController의 종류

  1. ViewController
    • 일반적인 VC
    • 안드로이드에서의 Activity와 비슷한 역할을 수행한다.
  2. Container ViewController
    • 다른 VC(ViewController)를 자신의 rootView에 넣는다.
    • rootView 내의 VC를 상황/조건에 따라 바꿔준다. -> 메모리 공간에서의 이점은 있겠으나, 이후의 Flow를 진행할 떄에, 예기치못한 상황이나 class 타입인 VC를 다루는 데에 포인터를 확실히 제거하지 않으면 retain Cycle이 발생할 것 같다.

TabBar

  • 화면 가장 하단에 위치하여, 모드 선택에 따라 그에 맞는 View를 보여주는 Interface이다.
  • 쉽게 페이스북, 카카오톡을 생각하면 된다

TabBarViewController

  • UIKit에 UIViewController를 상속받은 UITabBarController가 존재한다.

TabBar 구현 방법(1)

  1. StoryBoard에서 Root가 될 VC에 Tab Bar Controller 를 Embed한다
  2. Item으로 넣고 싶은 VC들을 ctrl+drag를 통해 삽입한다.TabBar 구현 방법(2)
  3. Root가 될 VC에 UITabBarController를 상속한다.
  4. 넣고 싶은 VC들을 생성하고 각각의 VC들의 tabBarItem을 초기화한다.
    • 이때, tabBarItem이란, TabBar에 보일 Item(즉, 버튼)이다
  5. 해당 VC array를 rootVC의 viewControllers에 넣는다.

VC 이동 하는 방법

  • 하단에 TabBar Item Button을 터치/클릭 하여 전환

H.I.G in Apple

  • 일반적으로 3~5개의 탭을 사용하라.
    • 너무 적으면 굳이 TabBar를 사용할 이유가 없으며, 너무 많으면 사용자에게 혼란을 줄 것이다.
  • 다른 영역으로 이동할 때, Tab Bar를 숨기지 마라

+ Recent posts