본문 바로가기
공부/[iOS&Swift]

[iOS] View Controller 와 Segue에 대한 아주 아주 기초적인 개념

by 인생은아름다워 2022. 2. 13.

 

Xcode에서 Stroyboard를 통해 애플리케이션을 만들어보면 항상 최상위에 ViewController라는것이 있음을 알 수 있다. 과연 이 뷰컨트롤러는 무슨 역할을 하는 것이고 어떻게 활용하면 되는것인가? 라는 궁금증이 생겨서 **View Controller Programming Guide for iOS** 문서를 읽으면서 공부해 보고자 한다. 그 중에서 아주 기초적인 내용들만 이번에 정리해두려고 한다.


✏️ View Controller의 역할

뷰 컨트롤러는 앱의 뼈대, 기반 역할을 한다.(Foundation) 모든 앱은 최소한 하나의 뷰컨트롤러를 가지고 있으며, 대다수의 앱은 여러개의 뷰 컨트롤러를 가진다. 각 뷰 컨트롤러는 앱 UI의 일정부분을 관리하고 또한 해당 인터페이스와 데이터와의 상호작용도 관리한다. 그리고 다른 인터페이스간의 전환(transition)또한 용이하게 한다.

 

여기까지 정리해보면, 뷰 컨트롤러는 자기가 담당하는 인터페이스의 상호작용을 관리한다고 보면 될 것 같다! 상호작용에는 위의 것들이 포함되는 것이다.

 

이렇게 뷰 컨트롤러는 앱의 중추적인 역할을하기에, 우리는 UIViewController클래스 또는 이 하위 클래스를 통해 앱의 여러 활동을 구현한다.

 

뷰 컨트롤러에는 두 가지 타입이 있다고 한다.

 

  • Content view controller
    • 일반적으로 생각하는 뷰컨트롤러가 될 것이다. 앱의 일부를 담당하고 있는 개개의 뷰컨트롤러들. 주로 만드는 뷰컨트롤러의 유형이다.
  • Container view controller
    • 다른 뷰컨트롤러(child view controller)를 담고있는 뷰 컨트롤러이다. 그리고 그것들을 어떻게 이동하고, 다른식으로 보여주는지를 컨트롤하는데 쓰이는 듯 하다.

 

대부분의 앱은 두 유형의 뷰컨트롤러들의 혼합형태로 구성되어있다.

뷰 컨트롤러의 가장 중요한 역할은 바로 뷰 계층(View hierarchy)를 관리하는 것이다. 모든 뷰 컨트롤러는 모든 컨텐츠들을 담고있는 하나의 root view를 가지고 있다. 그리고 이 루트뷰에 다른 뷰들을 계층적으로 포함시켜서 하나의 뷰 컨트롤러를 구성하는 것이다. 뷰 컨트롤러는 루트 뷰에 대한 참조를 가지고 있으며, 모든 뷰는 자신의 서브뷰에 대하여 강한참조를 하고있다.

(강한 참조, 약한 참조 관련 내용은 Swift의 ARC부분을 참고하면 좋을 듯 하다.)

이런 내용을 모르고 Netflix의 Main page를 내 마음대로 클론 해봤다. 만들고 보니 정확하게 위 그림의 구조를 따르고있었다.(어쩌면 당연한 이야기,,?)

거의 처음 만들어보는 UI이기 때문에 어떤 분들께서는 뭐 이따위야~~ 하실수도 있겠지만, 중요한 것은 루트뷰와 그 안에 많은 뷰들로 뷰 컨트롤러 하나가 구성되어있다는것을 알고있으면 될 것 같다.

 

✏️ Segue에 대하여

위와 같이 single view app을 구성해봤는데, 실제로 단일 뷰 앱은 많지 않을 것이다. 뭔가 화면간의 전환이 이뤄지고.. 다른 뷰 컨트롤러들끼리 소통을 할 것이고... 그럴 것으로 예상된다.

 

찾아보니 segue라는 것이 뷰 컨트롤러간 데이터를 전달받는 방법인 것으로 보인다. 위 문서에서 Presentations and Transitions - Using Segues 라는 부분을 보면 어느정도 감이 올 것 같다.

 

Segue를 통해 앱 인터페이스의 흐름을 정의할 수 있다. Segue는 같은 storyboard file내의 두 뷰 컨트롤러 간의 관계를 결정한다. Segue의 시작 점은 버튼, 테이블의 행, 또는 제스쳐인식기 등이 될 수 있으며, 끝 점은 나타내고 싶은 뷰 컨트롤러이다.(또는 unwind segue를 이용하여 뷰 컨트롤러를 해제시킬 수도 있다.)

Segue를 프로그래밍을 통해 trigger해줄 필요는 없다. 앱을 실행하면, UIKit이 뷰 컨트롤러와 연관된 segue들을 로드하여 각각의 segue와 상응하는 elements들과 잘 연결해주기 때문이다.

 

그래서 사용자가 elements와 상호작용 하면, UIKit이 적절한 뷰 컨트롤러를 로드하고, 앱에 segue가 발동되어야 한다는 것을 알림을 통해 알려주며, transition을 실행한다.

 

UIKit에서 보낸 알림을 사용하여 데이터를 새로운 뷰 컨트롤러에 전달하거나 segue가 완전히 발생하지 않도록 할 수도 있다.

이 부분을 요약하면, 프로그래밍을 통하지 않더라도, 우리가 원하는 뷰 컨트롤러간 전환이나 데이터 전달을 UIKit이 (segue를 이용하여) 잘 해준다는 것 같다.


🍎 결론

아주아주 간단하게 View Controller가 어떤 것인지, segue가 어떤 것인지에 대해 맛만 보았다.

내 나름대로의 정리를 하면 아래와 같다!

✔️View Controller : 앱의 특정 부분을 담당하는 뼈대 역할을 하며, 앱은 이러한 뷰 컨트롤러들의 조합으로 이루어져 있다.
✔️Segue : 뷰 컨트롤러간 transition 또는 데이터 전송을 할 수 있게 해주는 객체

 

댓글