XIB
![](https://velog.velcdn.com/images/rudin_/post/40960275-d37a-4391-a3fd-24918d573dce/image.png)
![](https://velog.velcdn.com/images/rudin_/post/e18a3423-c611-4865-b3cb-69e5f069b369/image.png)
- xib 파일이 같이 생성되는데, 계층구조에서 뷰 컨트롤러가 없다.
- 이 파일 자체가 뷰 컨트롤러고, 다른 뷰 컨트롤러를 추가할 수 없다.
- 파일 안에서 하나의 화면만 구현할 수 있다.
- 하위 호환성이 높다.
- 전체 흐름을 한 번에 파악하기 어려우며, 화면 이동 코드를 직접 작업해야 한다.
Storyboard
- 스토리 보드가 하나만 있어야 하는 것은 아니다.
- 스토리 보드끼리 연결할 수 있다.
- 성능이 낮은 맥에서 편집하게 되면 딜레이가 발생할 수 있다.
- 여러명이서 동시에 작업하면 머지 컨플릭트가 발생한다.
- 씬은 뷰컨트롤러 클래스와 1:1로 연결된다.
- 전체 편집 영역을
canvas
라고 한다.
![](https://velog.velcdn.com/images/rudin_/post/29d71566-b6dc-497a-a7f7-93b618cdbba9/image.png)
- 라이브러리에서 노란 아이콘의 파일들이 씬이다.
- 씬과 씬을 연결해서 UI의 흐름을 시각화할 수 있는 장점이 있다.
Initial View Controller
![](https://velog.velcdn.com/images/rudin_/post/9bee9bac-87e4-463b-9fa3-52d3d3cef2a0/image.png)
- 해당 화살표로 연결된 씬을 Initial View Controller 라고 한다.
- 앱 실행 시 가장 먼저 표시된다.
- 하나의 스토리 보드에서 반드시 하나의 씬은 Initial View Controller여야 한다.
- 뷰 컨트롤러의 인스펙터에서 Is Initial View Controller을 체크하거나, 해당 화살표를 원하는 씬으로 옮겨 설정한다.
![](https://velog.velcdn.com/images/rudin_/post/cb8d6f47-6141-45b2-812f-bf9247943655/image.png)
- 앱을 시작하면 윈도우 씬이 생성되고, 스토리보드도 자동으로 로딩되는데, Info 리스트에서 Storyboard Name으로 설정된 스토리보드가 로딩되는 것이다.
코드로 Scene 생성하기
- 씬을 연결할 때, 스토리보드 내에서 흐름이 복잡해지는 경우 코드로 생성하는 경우가 나을 수 있다.
![](https://velog.velcdn.com/images/rudin_/post/42b417bf-32ed-420c-bbc0-eb0f5d6911bb/image.png)
- 뷰 컨트롤러에는
storyboard
속성이 있는데, 해당 vc와 연결되어있는 스토리보드를 리턴한다. 따라서 스토리보드 객체를 직접 만들지 않아도 된다.
스토리보드의 이니셜 뷰 컨트롤러 만들기
![](https://velog.velcdn.com/images/rudin_/post/bec04afb-407f-4c13-9a5b-78d5ed6a4f9b/image.png)
결과
![](https://velog.velcdn.com/images/rudin_/post/4df0cb54-e53c-4b00-bd52-168d50bf97b8/image.png)
- 이미 있는 InitialViewController을 다시 Instantiate 하는 것이기 때문에 InitialViewController와 동일한 화면이 모달 방식으로 표시되는 것을 볼 수 있다.
스토리보드의 특정 뷰 컨트롤러 만들기
![](https://velog.velcdn.com/images/rudin_/post/87d567ed-2d62-469b-b0e7-3b33766c5b71/image.png)
withIdentifier:
: iOS 5.0 부터 사용된 메소드
identifier
: iOS 13.0부터 지원되었으며, 의존성 주입에 유리함.
![](https://velog.velcdn.com/images/rudin_/post/22e1955e-c2b2-4619-a6f4-728dc6eb9e14/image.png)
- 위 코드를 사용하려면 Storyboard ID가 입력되어있어야 한다.
![](https://velog.velcdn.com/images/rudin_/post/5298d531-7889-4968-be16-8b0c38ef1e54/image.png)
결과
![](https://velog.velcdn.com/images/rudin_/post/850d1eee-233c-4a67-a0ed-390104490dfa/image.png)
Storyboard Reference
하나의 스토리보드에서 작업하는 경우
- 씬의 흐름을 쉽게 파악할 수 있다.
- 성능이 낮은 맥에서 작업할 경우 성능이 저하된다.
- 협업을 할 경우 머지 컨플릭트 발생
- 기능이나 담당자 별로 스토리보드를 나눠 작업하는 것이 좋음
씬을 별도의 스토리보드로 분리하는 방법
![](https://velog.velcdn.com/images/rudin_/post/985a24f2-4c8a-4398-a975-39c1702a7873/image.png)
- vc 를 선택한 뒤,
Editor
-Refactor to Storyboard
- 해당 메뉴를 이용하면 스토리보드를 생성하고 연결하는 작업이 자동으로 처리됨
![](https://velog.velcdn.com/images/rudin_/post/dbf40d2a-701c-4c88-8ae0-205f0006f15d/image.png)
![](https://velog.velcdn.com/images/rudin_/post/004cfe86-8d4b-44b1-9dc2-4d800b12eefe/image.png)
Inspector-Storyboard Reference
![](https://velog.velcdn.com/images/rudin_/post/d948a516-fdfc-4a42-9dd3-86d8cd03843e/image.png)
- 분리되었던 기존의 스토리보드에 레퍼런스가 생성된다.
- Referenced ID를 삭제하면 새로 생성된 스토리보드의 Inital Controller와 연결된다.
- 이렇게 스토리보드를 분리해도 코드는 제대로 동작되는데, 아래의 이유를 보자.
![](https://velog.velcdn.com/images/rudin_/post/5298d531-7889-4968-be16-8b0c38ef1e54/image.png)
- 스토리보드를 전달했을 때, 같은 ID를 가지고 있는게
일반적인 씬
이라면 인스턴스를 만들어서 리턴
- 반대로 지금처럼
스토리보드 레퍼런스
라면, 연결된 스토리보드를 자동으로 만들고, 이니셜 뷰 컨트롤러나 스토리보드 레퍼런스와 연결되어있는 뷰 컨트롤러를 만들어서 리턴
다른 스토리보드의 뷰 컨트롤러 생성하기
![](https://velog.velcdn.com/images/rudin_/post/40251951-142f-43c5-9162-d27d544bc0b9/image.png)
![](https://velog.velcdn.com/images/rudin_/post/698a34bd-a029-481e-b034-0d6b6aeea42f/image.png)
스토리보드에서 스토리보드 레퍼런스
![](https://velog.velcdn.com/images/rudin_/post/c5f5872c-f3c0-47ce-932f-101f16a87f90/image.png)
![](https://velog.velcdn.com/images/rudin_/post/0331c712-fe96-4255-86ba-64357bd9e13e/image.png)
- 평소 세그를 연결하는 방식으로 해주고, Storyboard Reference에 원하는 스토리보드 이름을 입력하면 된다.
![](https://velog.velcdn.com/images/rudin_/post/cbbd9340-6452-409f-86f9-82c809c03ff7/image.png)
직접 스토리보드를 분리할 때 작업 순서
1. 이니셜 뷰 컨트롤러 지정
2. 스토리 뷰 레퍼런스 지정