본문 바로가기
iOS와 그 외/UIKit

[iOS] UIViewController - 1. 뷰 컨트롤러 만들기

by lody.park 2023. 12. 30.

안녕하세요 🎵 (Mel)Lody 입니다. ~~

영어 이름을 만들어봤어요. 앞으로는 포스팅 도입부마다 Lody라고 소개하려구요 ㅎㅎ.

UIViewController 에 대한 애플공식문서를 차례로 정리해보려고합니다.

 

목차는 다음과 같이 진행됩니다.

1. 뷰 컨트롤러 만들기

2. 스토리보드와 nib 정보

3. view 관리하기

4. 커스텀 컨테이너에서 자식 뷰 컨트롤러 관리하기

 

이번 포스팅에서는 뷰 컨트롤러를 만드는 법을 정리하려고 합니다.

 

스토리 보드를 이용해 뷰 컨트롤러 만들기

우선 Storyboard Interface Builder 기반의 프로젝트를 하나 만들어보겠습니다.

아래는 프로젝트 생성하면 제일 먼저 보이는 Main.storyboard 파일의 Interface Builder 인데요

 

좌측의 Document Outline을 통해 인터페이스 빌더의 계층을 확인할 수 있습니다.

ViewController 하나가 자동으로 생성되어 있네요.

 

ViewController를 선택하고 우측의 inspector 창을 열어보겠습니다.

inspector들 중 왼쪽에서 4번째에 있는 Identity inspector 창을 선택합니다. 

 

Identity inspector 는 개발자가 UI 요소의 속성을 보고 수정할 수 있게 해주는 도구입니다. 주로 스토리보드나 Xib 파일 내의 객체에 대한 세부 정보를 설정하고 관리하는 데 사용됩니다. (다른 기능들은 여기에선 따로 설명하지 않겠습니다)

 

아래 사진처럼 Identity inspector에서는 인터페이스 빌더 내의 객체에 대한 사용자 정의 클래스를 할당할 수 있습니다. 

현재는 프로젝트 생성시 자동으로 생성된 ViewController 클래스가 할당되어 있습니다.

이제 ViewController 클래스로 이동해보겠습니다.

 

 

프로젝트 생성 초기에 자동으로 생성된 클래스이긴 하지만, 헷갈릴수 있기 때문에 사용자 정의 클래스라고 하겠습니다.

 

네 아래는 방금 전 스토리보드 인터페이스 빌더 내의 뷰 컨트롤러 객체에 대해 identity inspector에서 할당한 사용자 정의 클래스 ViewController입니다.

 

ViewController 클래스는 UIViewController를 상속하고 viewDidLoad 메서드를 오버라이드해서 구현하고 있네요.

 

 

다시 스토리보드로 돌아가서 identity inspector 창을 보도록 하겠습니다.

지금 스토리보드 인터페이스 빌더 내부 뷰 컨트롤러에 기본으로 할당된 뷰 컨트롤러 클래스 파일을 할당하지 않은 상태로 만든다면 어떻게 될까요?

 

뷰 컨트롤러 객체는 생성이 될까요~? 안될까요~?

 

실행해보면 ~

 

잘 됩니다.

 

그렇다면 스토리보드 인터페이스 빌더에 정의한 뷰 컨트롤러 객체는 사용자 정의 클래스 할당 여부와 상관없이 초기화(생성)된다는 것을 알 수 있는데요.

 

사용자 정의 클래스를 할당한 경우사용자 정의 클래스를 할당하지 않은 경우의 차이는 뭘까요?

아래 표로 간단하게 정리해봤습니다.

  사용자 정의 클래스 할당 O 사용자 정의 클래스 할당 X
1. 뷰 컨트롤러에 할당되는 클래스 Identity Inspector를 통해 할당한 사용자 정의 클래스의 인스턴스로 생성합니다. 사용자 정의 클래스를 할당하지 않았으므로, 스토리보드는 UIViewController 클래스의 기본 인스턴스로 생성합니다.
2. 인스턴스 생성 앱이 실행되고 해당 뷰 컨트롤러가 필요할 때, 스토리 보드는 할당된 사용자 정의 클래스의 인스턴스를 생성합니다. 이 과정에서 init?(coder:) 생성자가 호출됩니다. 앱이 실행되고 해당 뷰 컨트롤러가 필요할 때, 스토리보드는 UIViewController의 기본 인스턴스를 생성합니다. 여기서도 init?(coder:)생성자가 호출되지만, 사용자 정의 클래스가 아닌 기본 클래스이기 때문에 기본 동작만 수행됩니다.
3. 사용자 정의 로직 할당된 클래스에 정의된 속성과 메서드, IBOutler, IBAction 등이 이 뷰 컨트롤러 인스턴스에 적용됩니다. 이를 통해 사용자가 정의한 특정 로직과 UI설정이 활성화됩니다. UIViewController의 기본 인스턴스는 사용자 정의 로직이나 추가 속성 없이 기본적인 뷰 컨트롤러 기능만을 제공합니다.

 

스토리보드 인터페이스 빌더의 인스펙터 창에서 제공되는 기능만으로 뷰 컨트롤러와 이와 연관된 뷰에 원하는 요구사항을 충족시켜줄 수 없을때, 또는 기본 기능을 오버라이드해 어떤 로직을 수행하려고 한다면 이를 반영한 사용자 정의 클래스를 정의하고, 뷰 컨트롤러에 할당해줘야합니다.

 

UIViewController의 생성자

애플 공식문서에서는 UIViewController의 생성자로 아래 2가지를 소개하고 있습니다.

 

우선 윗 녀석부터 먼저 정복해보겠습니다.

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

 

매개변수 설명

nibName: 이 매개변수는 load 하고자하는 nib 파일의 이름을 나타냅니다. nib 파일 이름을 문자열로 지정합니다. 만약 nil 을 지정하면, 시스템은 자동으로 뷰 컨트롤러 클래스 이름과 일치하는 nib 파일을 찾습니다.

 

bundle: 이 매개변수는 nib 파일이 저장된 번들(bundle)을 나타냅니다. 번들은 앱의 실행 파일과 그와 관련된 리소스를 포함하는 디렉토리입니다. 대부분의 경우, 이 매개변수에는 nil을 지정하며, 이 경우 기본 번들(즉, 앱 자체)에서 nib 파일을 찾습니다.

 

스토리보드를 통한 초기화 프로세스

뷰 컨트롤러, 이와 연관된 뷰들을 Storyboard로 정의하여 사용하는 경우, 절대로 해당 뷰 컨트롤러의 초기화를 직접 하지않습니다. segue가 trigger 되거나 프로그램적으로 앱에서 UIStoryboard 인스턴스 메서드 instantiateViewController(withIdentifire:) 를 호출하면 Storyboard에 의해 자동적으로 뷰 컨트롤러 객체가 초기화됩니다.

 

UIViewController는 내부적으로 storyboad라는 인스턴스 속성(읽기전용)을 가집니다. Storyboard로부터 뷰 컨트롤러가 초기화되지 않으면, nil 값을 가집니다.

 

스토리보드에서 뷰 컨트롤러 객체를 만들면, iOS는 init(code:) 생성자를 호출해 새로운 뷰 컨트롤러 객체를 만듭니다. 

 

nib 파일을 통한 초기화 프로세스

지정한 nib 파일은 즉시 load 되지 않습니다. 대신, 뷰 컨트롤러의 뷰에 처음 접근할 때 load 됩니다. 

또한 nib 파일이 로드된 후 추가적인 초기화 작업을 수행하고 싶다면, viewDidLoad() 메서드를 오버라이드해서 사용자 정의 로직을 추가해야합니다.

nibName 매개변수의 인자를 nil로 넘겨주고 loadView() 메서드를 오버라이드하지 않는 경우, 뷰 컨트롤러는 nibName 속성에서 설명된 대로 nib 파일을 자동으로 찾아서 로드하려고 시도합니다.

 

 

이제 두번째 생성자에 대해 설명할 시간이네요.

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621403-init

 

NSCoder 객체를 사용해서 뷰 컨트롤러를 초기화하는 생성자입니다. 이 생성자는 스토리보드나 Xib/Nib 파일에서 뷰 컨트롤러를 로드할 때 자동으로 호출됩니다.

매개변수 설명

coder: 스토리보드나 Xib/Nib 파일에 저장된 데이터를 NSCoder 객체를 통해 인코딩된 형태로 받습니다. 이 데이터에는 뷰 컨트롤러의 속성, 설정, 연결된 아웃렛(IBOutlet) 및 액션(IBAction) 정보 등이 포함됩니다. 

 

인자로 받은 인코딩된 데이터를 디코딩하여 데이터에 정의된 대로 뷰 컨트롤러의 인스턴스를 생성합니다.

 

 

뷰 컨트롤러와 뷰의 Lifecycle은 내일... 추가로... 

 

 

[참고 자료]

https://green1229.tistory.com/316

 

Nib & Xib (feat. storyboard)

안녕하세요. 그린입니다🍏 이번 포스팅에서는 Nib와 Xib에 대해 알아보겠습니다🙌 UI 구현 종류 우리가 iOS 개발을 하다보면 UI 즉, 화면을 그리는것은 빼놓을 수가 없습니다. iOS에서는 이 UI를 구

green1229.tistory.com

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

 

init(nibName:bundle:) | Apple Developer Documentation

Creates a view controller with the nib file in the specified bundle.

developer.apple.com