Warning: 이해한 부분을 최대한 남기고 정리하려 남긴 글 입니다. 틀린 부분이 있을 수 있습니다. 이점 유의하고 읽어주시면 감사할 것 같습니다. 그리고 틀린 부분 알려주시면 바로바로 고치도록 하겠습니다.
세그(Segue)는 스토리보드에서 뷰 컨트롤러 사이의 화면전환을 위해 사용되는
객체
입니다. 별도의 코드 없이도 스토리보드에서 세그를 연결하여 뷰 컨트롤러 사이의 화면전환을 구현할 수 있습니다.
스토리보드에서 뷰 컨트롤러간의 이동을 나타내는 화살표를 추상화시킨거라 봐도 무방하다.
세그의 시작점(startingpoint)은 button, table row, 또는 gester recognizer와 같은 세그를 개시하는 객체가 되고
세그의 도착점(end point)은 프로그래머가 유저에게 보여주고 싶은 view controller가 된다.
스토리보드에서 segue를 생성하는 것은 비교적 쉽다. 메서드를 선언하지 않고 그냥 원하는 시작점 객체를 control 클릭 후 드래그 하여 희망하는 뷰컨트롤러 도착점에 두면 원하는 타입의 세그를 생성할 수 있다.
Segue type | Behavior |
---|---|
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가 만들어지면 Segue의 객체에게 identifier 또는 식별자를 부여할 수 있다. 이 방식은 뷰컨트롤러가 여러 개의 Segue를 다룰 때 유용하게 사용된다.
Segue가 작동되면 거의 모든 작업은 기존의 뷰컨트롤러에서 이뤄진다. Segue실행시 UIKit은 기존의 뷰컨트롤러로 특정 메서드를 호출하여 새로 생성되는 뷰컨트롤러에게 영향을 줄 수 있게 된다
shouldPerformSegueWithIdentifier:sender:
메서드는 Segue를 생성할지 말지에 대한 기회를 제공한다. 만약 no를 해당 메서드가 리턴하게 되면 세그 생성을 막을 수 있게 된다 (다른 action에 대해서는 막지 않는다.)prepareForSegue:sender:
메서드는 기존의 뷰컨트롤러부터 생성되는 새로운 뷰컨트롤러로 데이터를 전달할 수 있게 해 준다. 해당 메서드로 넘겨진 UIStoryboardSegue 객체는 새로 생성될 뷰컨트롤러의 참조값과 segue와 관련된 정보를 갖게 된다.UnWind Segue는 생성되고 화면에 나온 뷰컨트롤러를 내려서(dismiss) 기존의 뷰컨트롤러로 돌아가게 하는 Segue이다. 프로그래머는 Exit역할을 하는 버튼과 unwind segue를 연결시켜주어서 해당 작업을 실행할 수 있게 된다. Exit버튼이 눌리면 UIKit은 뷰컨트롤러의 계층을 탐색하여 unwind segue를 할 수 있는 객체를 찾게 된다. unwind가 성공하면 내려간 뷰컨트롤러와 연결된 다른 뷰컨트롤러를 찾고 보여준다.
만드는 방법은 아래와 같다.
@IBAction func myUnwindAction(unWindSegue: UIStoryBoardSegue)
Segue의 생명주기를 알려면 Segue object의 생명주기를 알아야 합니다.
SegueObject는 UIStoryboardSegue class 또는 subclass의 객체입니다.
SegueObject는 앱 내부에서 직접적으로 만들어지지 않습니다.
UIKit이 SegueObject를 만들고 과정은 아래와 같습니다:
참고하면 좋을 블로그:
Segue를 통한 뷰 컨트롤러 전환과 데이터 교환 방법 · Wireframe (soooprmx.com)
[참조]:
View Controller Programming Guide for iOS: Using Segues (apple.com)
iOS 앱 프로그래밍 > 1) 세그(Segue)란? : boostcourse