BOID

[iOS] 뷰컨트롤러란? 본문

IOS 시작기

[iOS] 뷰컨트롤러란?

HoonIOS 2021. 3. 18. 21:51

안녕하세요 HoonIOS입니다 :)

저번에는 뷰, 윈도우, 대략적인 뷰컨트롤러에 대해서 포스팅을 했는데요

 

이번에는 저번에 대략적으로 설명만 했는데 이번에는 뷰컨트롤러에 대해 그리고 네비게이션 컨트롤러, 테이블 뷰 컨트롤러 등 많은 뷰컨트롤러들이 있는데요. 각 컨트롤러에 대해 설명을 드리고자 합니다.

 

뷰 컨트롤러

- 뷰컨트롤러는 앱의 근간을 이루는 객체로 모든 앱은 최소한 하나 이상의 뷰컨트롤러를 가지고 있습니다.( 뷰컨트롤러는 앱의 기본중의 기본이니 개념 중요해요!)

- 뷰컨트롤러의 주된 역할은 화면 구성 요소들, 즉 뷰를 관리 하는거지만 화면과 데이터 사이의 상호 작용관리까지 합니다.

- 윈도우 객체로 부터 전달된 이벤트를 받아서 내부적으로 구현된 비즈니스 로직을 실행하고, 그 결과로 얻어진 데이터를 콘텐츠를 만들어 화면에 표현하는 등, 모바일 애플리케이션에서 뷰 컨트롤러는 우리가 하는 대부분의 작업들의 중심에 있습니다.

- 뷰 컨트롤러는 여러 종류가 있습니다.

간단하게 ViewController, Navigation Controller, TableView Controller, TabBar Controller, Split ViewController, CollectionView Controller...가 있는데 CollectionView Controller는 요즘 유용하게 쓰이는 컨트롤러에 해당해서 나중에 해당 컨트롤러만 따로 정리해서 포스팅 하겠습니다.

( 그렇다고 나머지 Controller가 안중요하다는게 아니고 다 엄청 중요한데 CollectionVIew Controller를 좀더 알아보고 싶어서 공부좀 하고 포스팅 하려고 그런겁니다 ㅎ.ㅎ)

 

ViewController

- iOS에서 가장 기본이 되는 컨트롤러로서 앱의 데이터를 표시될 외형을 연결해서 하나의 동적인 화면을 만들어 내는 컨트롤러입니다.

- 뷰컨트롤러 내부에 뷰를 포함하므로 원하는대로 화면을 직접 구상하고 컨트롤러들을 배치할수 있습니다.

- 뷰컨트롤러에 해당하는 UIKit프레임워크의 클래스는 UIViewController입니다.

- 이 컨트롤러에 연결될 클래스는 작성하려면 반드시 UIViewController클래스를 상속받아야합니다.

- 아래 사진은 ViewController입니다.

UIViewController

Navigation Controller

- 앱의 화면 이동에 대한 관리와 그에 연관된 처리를 담당해주는 컨트롤러입니다.

- 이 컨트롤러는 내부적으로 다른 컨트롤러를 포함하여 컨트롤러끼리 화면 이동을 처리해주고 현재의 페이지 위치에 대한 네비게이션 역할을 합니다.

- 뷰를 포함하고 있지 않으므로 하나의 화면을 담당하지 못하고, 다른 컨트롤러와 결합하여 부분적으로 화면을 구성합니다. 스토리보드에는 2개의 화면이 구성되어 있으나 실제로는 하나의 화면으로 나타나는 경우입니다.

- 이 컨트롤러가 추가된 앱 상단에는 네비게이션 바가 추가됩니다.

- 네비게이션 컨트롤러를 정의하는 UIKit 프레임워크의 클래스는 UINavigationController입니다.

- 네비게이션 컨트롤러를 직접 구현하고자 한다면 클래스를 상속받아야 합니다.

- 아래 UINavigation Controller 그림을 보면 상단에 네비게이션 바가 보이고 스토리보드가 2개이지만 사실상 UINavigationController의 UILabel이 있는 컨트롤러만 화면에 나타납니다.

UINavigation Controller

TableView Controller

- 내부에 리스트 형식의 테이블 뷰를 포함하고 있어 여러 항목이나 데이터를 화면에 나열하기 위한 목적으로 사용되는 컨트롤러 입니다.

- 하나의 컨트롤러가 하나의 화면을 이루는 단위 컨트롤러입니다.

- 테이블 뷰 컨트롤러에 해당하는 UIKit 프레임워크는 UITableViewController클래스입니다.

- 테이블 뷰 컨트롤러를 이용한 화면을 구성하기 위해서는 UITableViewController를 상속받아 추가 구현하는 작업이 필요합니다.( 예를들어 delegate와 dataSource를 상속받아 메서드를 구현하는 등이 있지만 이것은 추후 TableViewController만 포스팅 할때 다뤄 보겠습니다. 왜냐하면 안그러면 양이 엄청 많아지거든요... 읽다가 다들 뒤로가기 하실꺼에요 ㅠㅠ)

- 대표적으로 아이폰에서 앱 설정이 있는데요 아래처럼 여러 항목이 화면에 나열되어 있는것을 볼수 있습니다.

UITableView Controller

TabBar Controller

- 화면을 나타내는 여러개의 탭이 있고, 탭을 터치하면 해당하는 화면이 전환되는 형태의 앱을 만들고자 할때 사용하는 컨트롤러입니다.( 이해가 안되시면 밑에 예제 그림을 한번 슥 보고오세요 ㅎㅎ)

- 탭마다 다른 뷰컨트롤러를 연결하여 화면을 구성하며 직접 화면 전체를 나타내는것이 아닌, 복잡적으로 화면을 구성하는 역할읗 합니다.( 네비게이션 컨트롤러와 마찬가지 입니다)

- iOS앱에서 시계 기본 앱을 키면밑에 시계알림, 알람, 스톱워치, 타이머 탭들이 있는데 이런 구성을 구현하는게 TabBar Controller 입니다.

- 탭바 컨트롤러에 해당하는 UIKit 프레임워크의 클래스는 UITabBar Controller입니다.

UITabBarController와 시계앱

 

Split ViewController

- 스플릿 뷰컨트롤러는 xCode에서 프로젝트를 생성하는 과정 중 프로젝트 템플릿 선택 단계에서 Master-Detail Application 템플릿을 선택하면 생성되는 기본컨트롤러입니다.

Master-Detail App 템플릿

 - 목록을 나열하는 마스터 페이지와 그 목록에 각각에 대한 세부 내용을 보여주는 데테일 페이지로 구성되는 스플릿 뷰 컨트롤러는 화면 크기에 따라 두 페이지를 하나의 화면에 조합하여 보여줄것인지 아니면 두 개의 화면으로 나누어 보여줄 것인지 자동으로 처리해주는 특징이 있습니다.( 아이폰에서는 잘 안쓰는 컨트롤러 입니다. )

- 아이패드 설정에서 볼수 있는 화면이 스플릿 뷰 컨트롤러입니다.

- 스플릿 뷰 컨트롤러에 해당하는 UIKit 프레임워크의 클래스는 UISplitViewController 클래스이지만 , 직접적인 화면을 구현하지 않습니다.

- 마스터/디테일 페이지로 사용할 뷰 컨트롤러들을 화면의 크기에 따라 적절히 조합해주는 역할을 합니다.

UISplitViewController

뷰의 관리

- 뷰컨트롤러를 알아봤으니 이제 뷰의 계층을 관리하는 역할을 알아보겠습니다.( 아주 중요합니다.)

- 뷰 컨트롤러에는 컨트롤러 내부에 모든 객체의 대장인 루트뷰 하나입니다. 이 루트뷰는 일반뷰, 테이블뷰, 컬렉션 뷰등 다양한 뷰가 루트뷰로 지정해 줄수 있습니다.

- 스토리보드에서 뷰컨트롤러 위에 배치하는 대부분의 객체들은 실제로는 모든 루트뷰에 추가되는 서브뷰라고 할수 있습니다.

- 뷰들의 구조는 루트뷰의 서브뷰, 서브뷰의 서브뷰로 계층을 이루고 있습니다.

- 우리는 개발을 할때 항상 모든 객체를 루트뷰 혹은 그 아래에 추가해야 합니다. 루트뷰 없이 곧바로 뷰컨틀로러에 객체를 추가할수 없습니다.

- 루트뷰를 설정 확인 방법은 스토리보드 맨 앞에 화살표가 있으면 루트뷰가 설정되어 있는것입니다, 아래 그림을 보면 앞에 화살표가 되어있는것을 확인 할수 있습니다.

루트뷰컨트롤러

- 아래 사진은 뷰컨트롤러와 뷰의 관계를 나타낸 그림이다.

뷰컨트롤러와 뷰의 관계

- 뷰컨트롤러에는 루트뷰가 연결되어 있고 그아래에 쭈우우우욱 서브뷰들이 이어져있습니다. 이렇게 체인처럼 뷰컨트롤러 부터 가장 하위의 서브뷰에 이르기까지 계층 구조를 따라 참조가 이어지고 있습니다.

- 이 때문에 뷰컨트롤러가 하위의 모든 뷰에 대한 참조를 가지고 있지 않아도 모든 뷰에 접근할수 있습니다.(체인처럼 참조가 이어지고 있으니깐 가능하겠죠?)

- 우리는 뷰컨트롤러를 통해 뷰를 통제하고, 뷰가 사용자와 상호작용할수 있도록 필요한 코드를 뷰컨트롤러에 작성을 합니다.

 

 

지금까지 간단한 컨트롤러의 종류와 역할 그다음 뷰의 관리, 관계에 대해 알아보았습니다. 중요한 내용이니 꼭!!!! 읽어보시는걸 추천드립니다 ㅎ.ㅎ

긴글 읽어주셔서 고생하셨습니다 :)

반응형
Comments