개발을 시작하는 이야기

XIB를 활용하기 본문

개발 이야기/Swift

XIB를 활용하기

Teiresias 2022. 3. 23. 18:10

iOS에서 화면을 구성할 때 사용하는 대표적인 방식 세 가지는 Storyboard, Xib, code가 있다. MVC 패턴을 위해 뷰 코드와 컨트롤러를 분리하는 목적으로 만들어졌는데, 세 가지 중에서 XIB를 활용하여 Cell을 제작하는 것을 정리해본다.

XIB 파일이란?

 Xcode Interface Builder의 약자로써 화면을 구성하는 클래스들을 XML 문법에 맞추어서 저장된다. 바이너리가 아닌 XML 형태로 저장하기 때문에 수정된 부분을 쉽게 알 수 있어서 소스코드로 관리가 가능하다. 수정을 하기 위해서는 XML문법을 맞춰서 수정해야 하지만 Xcode에선 Interface Builder를 제공을 해주기 때문에 그래픽 형태로 수정이 가능하다.

NIB은 또 뭐야?

 Nextstep Interface Builder의 약자로, 화면을 구성하는 클래스들을 바이너리 형태의 압축 파일로 저장한다. 뷰 정보를 담고 있는 XIB 파일을 빌드하게 되면, 우선 접근하기 쉬운 바이너리 NIB파일로 컴파일 되고, 앱의 번들로 복사된 후 실행파일에서 사용된다.

 

XIB를 컴파일 했을때 NIB가 생성된다.

XIB 만들어 사용하기

Also create XIB file

 UITableViewCell Custom Class 파일을 만들때, Also create XIB file을 체크해준다.

 

Also create XIB file

 이렇게 하면 .swift 파일과. xib 파일이 만들어지고, XIB 파일을 클릭하면 UITableViewCell을 별도로 작업할 수 있는 인터페이스 빌더 창이 나오게 된다.

네비게이터 영역에서 확인한 XIB파일
XIB 파일의 Interface Builder 영역

Cell Identifier

 이전 방법에서는 UITableViewCell 클래스 생성 후 인터페이스에서 Custom Class도 함께 지정을 해주어야 하지만, xib로 만들면 자동으로 지정이 되어있기 때문에 이 과정은 생략할 수 있지만 Identifier는 설정해주어야 한다.

Register Cell

 이제는 테이블뷰에서 XIB로 제작한 Cell을 사용하겠다고 코드로 선언을 해주어야 한다. nibName에는 TableViewCell.swift파일 이름을, forCellReuseIdentifier에는 Cell의 Identifier를 넣어주면 된다. XIB로 작업을 할 때 register가 없는 경우, cellForRowAt 메서드에서 런타임 오류가 발생하게 된다.

💡.xib와 .swift 파일을 각각 만드는 경우

 .xib, .swift 파일을 각각 생성한 경우 두 파일을 연결해주기 위한 작업이 필요하다.

.xib 파일을 선택할때 보이는 화면

.xib 파일의 Placeholders 아래에 있는 File's Owner를 클릭하고 Attributes Inspector 탭을 보면 File's Owner Class를 지정하는 곳에서 함께 생성한. swift 파일을 입력해주면 소스가 연결된다. 그리고 View 자체에서도 동일하게 설정해준다.

 

Placeholders: UIView처럼 보여지는 주요 요소가 아닌, 빠져있는 것을 대신하여 연결해주는 역할

File's Owner: nib 파일을 앱코드와 연결시켜주는 객체(nib 파일의 내용을 책임지는 컨트롤러)

First Responder 객체: Responder 객체가 이벤트를 받으면 이를 처리하거나 다른 Responder 객체에게 처리할 수 있도록 넘겨야 할 의무가 존재한다. UIKit은 적절한 Responder를 지정해서 이벤트를 넘겨서 처리하게 되는데, 처음으로 이벤트를 받는 Responder를 First Responder로 지칭한다. 

 

참고 : SeSAC 강의 자료, 공식문서, 블로그

'개발 이야기 > Swift' 카테고리의 다른 글

MVVM(Model, View, ViewModel) 패턴  (0) 2022.03.25
MVC(Model, View, Controller) 패턴  (0) 2022.03.24
StoryBoard를 사용하기  (0) 2022.03.22
@main  (0) 2022.03.21
앱 시닝(app thinning)  (0) 2022.03.20