"Pass data between view controllers during a segue, and programmatically control when segues occur."
세그가 일어나는 동안 뷰 컨트롤러 사이에 데이터를 전달합니다. 그리고 세그 발생 시 코드 내용으로 제어합니다.
사용자가 세그를 실행하면, UIKit
은 스토리보드에서 찾을 수 있는 옵션을 사용해 뷰 컨트롤러를 제시합니다. 또한, UIKit
은 세그 프로세스를 동적으로 수정할 수 있는 기회를 줍니다. 여기에는 세그 발생을 방지하거나 세그 발생 시 추가 작업을 진행할 수 있도록 하는 것을 포함합니다.
세그 생성에 대한 방법은 pecify Presentations Visually in Your Storyboard File을 살펴보시기 바랍니다.
Specify Presentations Visually in Your Storyboard File
https://velog.io/@panther222128/Showing-and-Hiding-View-Controllers
https://developer.apple.com/documentation/uikit/view_controllers/showing_and_hiding_view_controllers#3370707
세그의 타입은 세그를 제시하거나 해제할 때 아래 테이블에서 보이는 것처럼 UIKit
이 사용할 애니메이션의 종류를 결정합니다. 세그를 생성할 때 타입을 구체화할 수 있고, 특성 인스펙터에서 나중에 이를 변경할 수도 있습니다.
Segue type | Behavior |
---|---|
Show (Push) | 부모 뷰 컨트롤러가 프리젠테이션 동작을 정의하는 show(_:sender:) 액션 메소드를 구현하지 않는 한 뷰 컨트롤러를 모달로 표시합니다. 예를 들어 UINavigationController 는 새 뷰 컨트롤러를 네비게이션 스택에 추가합니다. |
Show Detail (Replace) | 부모 뷰 컨트롤러가 프리젠테이션 동작을 정의하는 show(_:sender:) 액션 메소드를 구현하지 않는 한 뷰 컨트롤러롤 모달로 표시합니다. 예를 들어 UISplitViewController 는 두 번째 자식 뷰 컨트롤러(디테일 컨트롤러)를 새 뷰 컨트롤러로 교체합니다. |
Present Modally | 구체화된 프리젠테이션과 전환 스타일을 사용해 뷰 컨트롤러를 모달로 표시합니다. |
Present as Popover | 수평 regular 환경에서 UIKit 은 뷰 컨트롤러를 팝오버에서 나타내도록 합니다. 수평 compact 환경에서 UIKit 은 뷰 컨트롤러를 모달로 나타내도록 합니다. |
Show
와 Show Detail
프리젠테이션 스타일로 세그를 수행하는 방법에 대한 더 많은 정보는 Let the Current Context Define the Presentation Technique을 살펴보시기 바랍니다.
Let the Current Context Define the Presentation Technique
https://velog.io/@panther222128/Showing-and-Hiding-View-Controllers
https://developer.apple.com/documentation/uikit/view_controllers/showing_and_hiding_view_controllers#3370705
만약 현재 뷰 컨트롤러로부터 사용자가 빠져나가는 것을 원하지 않는다면, 소스 뷰 컨트롤러의 shouldPerformSegue(withIdentifier:sender:)
메소드로부터 false
를 반환하도록 하여 UIKit
에게 세그를 수행하지 않도록 할 수 있습니다. 세그 진행 여부에 대한 결정이 필요한지 확인하려면 위 메소드를 사용하시기 바랍니다. 예를 들어 뷰 컨트롤러의 컨텐트가 유효하지 않고, 사용자 액션의 수정이 필요한 경우 false
를 반환하면 됩니다. true
를 반환하는 것은 세그를 진행하도록 합니다. false
를 반환하면 세그가 조용히 실패하도록 합니다.
UIKit
은 세그가 동작하는 동안 뷰 컨트롤러를를 생성하고 제시하기 때문에 세그 발생 전 데이터의 전달이 필요한 경우 prepare(for:sender:)
메소드를 사용해야 합니다. 세그가 초기화되는 객체를 포함하는 뷰 컨트롤러에 이 메소드를 구현해야 합니다. 어떤 세그가 실행되었는지에 대한 정보와 함께 제공된 UIStoryboardSegue
객체로부터 새 뷰 컨트롤러를 가져와야 합니다.
아래 코드 예시에서 현재 뷰 컨트롤러는 선택된 테이블 행과 관련이 있는 이미지를 가져오고, 해당 이미지를 새 뷰 컨트롤러에 전달합니다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller.
if let imageVC = segue.destination as? ImageViewController {
// Fetch the image for the selected row.
let image = getImageForSelectedRow()
imageVC.currentImage = image
}
}
제시된 뷰 컨트롤러에서 기존 뷰 컨트롤러로 다시 데이터를 가져오기 위해서는 딜리게이트 디자인 패턴을 사용하시기 바랍니다. 해당 딜리게이트 관계는 prepare(for:sender:)
메소드에서 설정하시기 바랍니다.
UIKit
이 자동으로 세그를 처리할지라도 새 뷰 컨트롤러를 표시하는 것과 관련이 있는 작업을 수행할 여러 가지 장소가 존재합니다. 아래 그림은 프로세스가 완료되기까지 사용자가 세그를 실행했을 시점으로부터 발생한 이벤트의 흐름을 보여줍니다. 세그 관련 액션을 수행하는 수행 장소는 현재 뷰 컨트롤러의 prepareForSegue:sender:
메소드입니다. 새 뷰 컨트롤러의 생성이 이뤄지는 동안에도 작업을 수행할 수 있습니다.
다음에 표시할 가장 적합한 뷰 컨트롤러를 동적으로 선택하는 언와인드 세그를 스토리보드 파일에서 설정합니다.
https://developer.apple.com/documentation/uikit/resource_management/dismissing_a_view_controller_with_an_unwind_segue
https://velog.io/@panther222128/Dismissing-a-View-Controller-with-an-Unwind-Segue
인터페이스 빌더 스토리보드 리소스 파일에서 표현되는 디자인 타임 뷰 컨트롤러 그래프의 캡슐화입니다.
https://developer.apple.com/documentation/uikit/uistoryboard
https://velog.io/@panther222128/UIStoryboard
두 뷰 컨트롤러 사이에서 시각적 전환을 준비하고 수행하는 객체입니다.
https://developer.apple.com/documentation/uikit/uistoryboardsegue
https://velog.io/@panther222128/UIStoryboardSegue
언와인드 세그에 대한 정보의 캡슐화입니다.
https://developer.apple.com/documentation/uikit/uistoryboardunwindseguesource
https://velog.io/@panther222128/UIStoryboardUnwindSegueSource