[iOS] Segue

Inwoo Hwang·2021년 8월 26일
1

iOS

목록 보기
2/13
post-thumbnail

Warning: 이해한 부분을 최대한 남기고 정리하려 남긴 글 입니다. 틀린 부분이 있을 수 있습니다. 이점 유의하고 읽어주시면 감사할 것 같습니다. 그리고 틀린 부분 알려주시면 바로바로 고치도록 하겠습니다.

Segue


Segue란?

세그(Segue)는 스토리보드에서 뷰 컨트롤러 사이의 화면전환을 위해 사용되는 객체 입니다. 별도의 코드 없이도 스토리보드에서 세그를 연결하여 뷰 컨트롤러 사이의 화면전환을 구현할 수 있습니다.

iOS 앱 프로그래밍 > 1) 세그(Segue)란? : boostcourse

스토리보드에서 뷰 컨트롤러간의 이동을 나타내는 화살표를 추상화시킨거라 봐도 무방하다.

세그의 시작점(startingpoint)은 button, table row, 또는 gester recognizer와 같은 세그를 개시하는 객체가 되고

세그의 도착점(end point)은 프로그래머가 유저에게 보여주고 싶은 view controller가 된다.

Segue는 어떻게 생성하지?

스토리보드에서 segue를 생성하는 것은 비교적 쉽다. 메서드를 선언하지 않고 그냥 원하는 시작점 객체를 control 클릭 후 드래그 하여 희망하는 뷰컨트롤러 도착점에 두면 원하는 타입의 세그를 생성할 수 있다.

Segue의 타입

Segue typeBehavior
Show (Push)Show Segue는 showViewController:sender: 메서드를 사용하여 희망하는 뷰컨트롤러의 컨텐츠를 보여준다.거의 모든 뷰컨트롤러에서, show타입의 Segue는 새로운 컨텐츠를 모달 방식으로 원천이 되는 뷰컨트롤러 위에 얹어서 보여주는 방식으로 동작한다. 일부 뷰컨트롤러는 이 메서드를 오버라이드 해서 여러가지 다른 동작을 취하기도 한다. 예를 들어 네비게이션 컨트롤러는 새로운 뷰컨트롤러를 자신의 stack에 push 한다. UIKit은 targetViewControllerForAction:sender: 메서드를 활용하여 기존의 뷰컨트롤러를 찾고 반환한다 (새롭게 생성되는 뷰컨트롤러가 아닌). 해당 메서드는 뷰컨트롤러 계층을 올라가며 show(:sender)를 오버라이드한 뷰컨트롤러를 찾게 되고 찾을 경우 반환된 뷰컨트롤러의 show 메서드를 이용하고 찾지 못할 경우 nil을 반환하게 된다.
Show Detail (Replace)Show Detail Segue는 타겟으로하는 뷰컨트롤러의 새로운 컨텐츠를showDetailViewController:sender: 메서드를 통해 보여준다. 해당 Segue는UISplitViewController object에 포함되는 뷰컨트롤러에만 사용하는 것이 적절하다. 해당 Segue를 사용하면 스플릿뷰 컨트롤러는 자신의 두번 째 자식 뷰컨트롤러(디테일 컨트롤러)를 새로운 컨텐츠로 바꾼다. 다른 뷰컨트롤러는 모달 방식 동작하여 새로운 컨텐츠를 보여준다. UIKit은 targetViewControllerForAction:sender: 메서드를 활용하여 기존의 뷰컨트롤러를 찾고 반환한다.. 해당 메서드는 뷰컨트롤러 계층을 올라가며 show(:sender)를 오버라이드한 뷰컨트롤러를 찾게 되고 찾을 경우 반환된 뷰컨트롤러의 show 메서드를 이용하고 찾지 못할 경우 nil을 반환하게 된다.
Present Modally해당 Segue는 사용자가 설정한 presentation style과 transitionStyle에 따라 모달 방식으로 뷰 컨트롤러를 띄운다.
Present as Popover가로길이가 레귤러 사이즌인 경우 모달을 popover 형태로 화면을 띄우지만 가로길이가 매우 타이트한 사이즈인 경우 모달을 fullsize 형태로 화면에 띄운다.

show(:sender:)를 오버라이드 할 때 절대 super.show(:sender:)를 호출하지 마세요!
show 내부에서 targetViewController(forAction:sender:)을 호출하고, 이 메소드는 show가 override가 되어 있는 뷰컨트롤러에 대해서 show를 호출합니다. 이 과정에서 루프가 생기게 됩니다.

[출처]: Segue 파헤치기 (jcsoohwancho.github.io)

Segue가 만들어지면 Segue의 객체에게 identifier 또는 식별자를 부여할 수 있다. 이 방식은 뷰컨트롤러가 여러 개의 Segue를 다룰 때 유용하게 사용된다.

Segue의 작동원리

Segue가 작동되면 거의 모든 작업은 기존의 뷰컨트롤러에서 이뤄진다. Segue실행시 UIKit은 기존의 뷰컨트롤러로 특정 메서드를 호출하여 새로 생성되는 뷰컨트롤러에게 영향을 줄 수 있게 된다

  • shouldPerformSegueWithIdentifier:sender:메서드는 Segue를 생성할지 말지에 대한 기회를 제공한다. 만약 no를 해당 메서드가 리턴하게 되면 세그 생성을 막을 수 있게 된다 (다른 action에 대해서는 막지 않는다.)
  • prepareForSegue:sender: 메서드는 기존의 뷰컨트롤러부터 생성되는 새로운 뷰컨트롤러로 데이터를 전달할 수 있게 해 준다. 해당 메서드로 넘겨진 UIStoryboardSegue 객체는 새로 생성될 뷰컨트롤러의 참조값과 segue와 관련된 정보를 갖게 된다.

UnWind Segue란? 어떻게 만들지?

UnWind Segue는 생성되고 화면에 나온 뷰컨트롤러를 내려서(dismiss) 기존의 뷰컨트롤러로 돌아가게 하는 Segue이다. 프로그래머는 Exit역할을 하는 버튼과 unwind segue를 연결시켜주어서 해당 작업을 실행할 수 있게 된다. Exit버튼이 눌리면 UIKit은 뷰컨트롤러의 계층을 탐색하여 unwind segue를 할 수 있는 객체를 찾게 된다. unwind가 성공하면 내려간 뷰컨트롤러와 연결된 다른 뷰컨트롤러를 찾고 보여준다.

만드는 방법은 아래와 같다.

  1. 먼저 Unwind가 끝난 뒤 보여질 뷰컨트롤러를 선택한다.
  2. 해당 뷰컨트롤러에 아래와 같은 메서드를 작성한다.
@IBAction func myUnwindAction(unWindSegue: UIStoryBoardSegue)
  1. 지울 뷰컨트롤러를 선택한 다.
  2. unwind작업을 할 버튼 또는 다른 객체를 클릭한 뒤 아래와 같은 마우스 드래그앤드랍(drag & drop)을 실행한다.

Segue의 생명 주기

  • Segue의 생명주기를 알려면 Segue object의 생명주기를 알아야 합니다.

  • SegueObject는 UIStoryboardSegue class 또는 subclass의 객체입니다.

  • SegueObject는 앱 내부에서 직접적으로 만들어지지 않습니다.

  • UIKit이 SegueObject를 만들고 과정은 아래와 같습니다:

  1. 전환될 뷰 컨트롤러가 만들어지고 초기화(initialized)됩니다.
  2. Segue Object가 만들어지고 init(identifier:source:destination:) 생성자가 호출됩니다. 인자는 각각 storyboard에서의 identifier, 출발 뷰컨트롤러,도착 뷰컨트롤러 입니다.
  3. 출발 뷰컨트롤러의 prepare(for:sender:) 메소드를 호출합니다.
  4. Segue Object의 perform 메소드가 호출되며 실제 전환이 일어납니다.
  5. Segue Object의 참조가 해제되면서 생명 주기가 끝납니다[UnwindSegue 직후가 아닌 화면전환 이후].

참고하면 좋을 블로그:

Segue를 통한 뷰 컨트롤러 전환과 데이터 교환 방법 · Wireframe (soooprmx.com)

[참조]:

View Controller Programming Guide for iOS: Using Segues (apple.com)

iOS 앱 프로그래밍 > 1) 세그(Segue)란? : boostcourse

Segue 파헤치기 (jcsoohwancho.github.io)

iOS에서 세그를 통한 화면전환 정리 | Breadcrumbs (seizze.github.io)

profile
james, the enthusiastic developer

0개의 댓글