Customizing the Behavior of Segue-Based Presentations

Panther·2021년 7월 27일
0

https://developer.apple.com/documentation/uikit/resource_management/customizing_the_behavior_of_segue-based_presentations

"Pass data between view controllers during a segue, and programmatically control when segues occur."

세그가 일어나는 동안 뷰 컨트롤러 사이에 데이터를 전달합니다. 그리고 세그 발생 시 코드 내용으로 제어합니다.

Overview

사용자가 세그를 실행하면, 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

Configure the Presentation Style of the Transition

세그의 타입은 세그를 제시하거나 해제할 때 아래 테이블에서 보이는 것처럼 UIKit이 사용할 애니메이션의 종류를 결정합니다. 세그를 생성할 때 타입을 구체화할 수 있고, 특성 인스펙터에서 나중에 이를 변경할 수도 있습니다.

Segue typeBehavior
Show (Push)부모 뷰 컨트롤러가 프리젠테이션 동작을 정의하는 show(_:sender:) 액션 메소드를 구현하지 않는 한 뷰 컨트롤러를 모달로 표시합니다. 예를 들어 UINavigationController는 새 뷰 컨트롤러를 네비게이션 스택에 추가합니다.
Show Detail (Replace)부모 뷰 컨트롤러가 프리젠테이션 동작을 정의하는 show(_:sender:) 액션 메소드를 구현하지 않는 한 뷰 컨트롤러롤 모달로 표시합니다. 예를 들어 UISplitViewController는 두 번째 자식 뷰 컨트롤러(디테일 컨트롤러)를 새 뷰 컨트롤러로 교체합니다.
Present Modally구체화된 프리젠테이션과 전환 스타일을 사용해 뷰 컨트롤러를 모달로 표시합니다.
Present as Popover수평 regular 환경에서 UIKit은 뷰 컨트롤러를 팝오버에서 나타내도록 합니다. 수평 compact 환경에서 UIKit은 뷰 컨트롤러를 모달로 나타내도록 합니다.

ShowShow 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

Prevent a Segue Based on Dynamic Conditions

만약 현재 뷰 컨트롤러로부터 사용자가 빠져나가는 것을 원하지 않는다면, 소스 뷰 컨트롤러의 shouldPerformSegue(withIdentifier:sender:) 메소드로부터 false를 반환하도록 하여 UIKit에게 세그를 수행하지 않도록 할 수 있습니다. 세그 진행 여부에 대한 결정이 필요한지 확인하려면 위 메소드를 사용하시기 바랍니다. 예를 들어 뷰 컨트롤러의 컨텐트가 유효하지 않고, 사용자 액션의 수정이 필요한 경우 false를 반환하면 됩니다. true를 반환하는 것은 세그를 진행하도록 합니다. false를 반환하면 세그가 조용히 실패하도록 합니다.

Pass Data to the Presented View Controller

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:) 메소드에서 설정하시기 바랍니다.

Understand the Sequence of Events During a Segue

UIKit이 자동으로 세그를 처리할지라도 새 뷰 컨트롤러를 표시하는 것과 관련이 있는 작업을 수행할 여러 가지 장소가 존재합니다. 아래 그림은 프로세스가 완료되기까지 사용자가 세그를 실행했을 시점으로부터 발생한 이벤트의 흐름을 보여줍니다. 세그 관련 액션을 수행하는 수행 장소는 현재 뷰 컨트롤러의 prepareForSegue:sender: 메소드입니다. 새 뷰 컨트롤러의 생성이 이뤄지는 동안에도 작업을 수행할 수 있습니다.

See Also


Storyboards

Dismissing a View Controller with an Unwind Segue

다음에 표시할 가장 적합한 뷰 컨트롤러를 동적으로 선택하는 언와인드 세그를 스토리보드 파일에서 설정합니다.

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

UIStoryboard

인터페이스 빌더 스토리보드 리소스 파일에서 표현되는 디자인 타임 뷰 컨트롤러 그래프의 캡슐화입니다.

https://developer.apple.com/documentation/uikit/uistoryboard
https://velog.io/@panther222128/UIStoryboard

UIStoryboardSegue

두 뷰 컨트롤러 사이에서 시각적 전환을 준비하고 수행하는 객체입니다.

https://developer.apple.com/documentation/uikit/uistoryboardsegue
https://velog.io/@panther222128/UIStoryboardSegue

UIStoryboardUnwindSegueSource

언와인드 세그에 대한 정보의 캡슐화입니다.

https://developer.apple.com/documentation/uikit/uistoryboardunwindseguesource
https://velog.io/@panther222128/UIStoryboardUnwindSegueSource


0개의 댓글