[번역] Showing and hiding view controllers (애플 공식 문서)

삭제된 Velog·2024년 9월 30일

UIKit

목록 보기
14/21
post-thumbnail

본 글은 Showing and hiding view controllers (애플 공식 문서)를 한국어로 번역하여 옮긴 글입니다.

서로 다른 방법을 사용하여 뷰 컨트롤러를 화면에 표시하고, 전환(transition)되는 동안 데이터를 주고 받으세요.


Overview

뷰 컨트롤러를 표시하고(present) 사라지게(dismiss)함으로써 앱의 인터페이스를 바꿀 수 있습니다. 모든 윈도우는 윈도우의 초기 컨텐츠를 제공하는 최상위 뷰 컨트롤러를 가집니다. 새로운 뷰 컨트롤러를 표시하면 윈도우에 새로운 뷰의 집합을 설치하여 컨텐츠를 바꿉니다. 뷰 컨트롤러가 더 이상 필요 없어지면, 해당 뷰 컨트롤러를 사라지게 하고 뷰들을 윈도우에서 삭제합니다. 아래 방식 중 하나로 뷰 컨트롤러를 보이게 할 수 있습니다.

  • 스토리보드에서 화면을 시각적으로 구성하세요.

  • 뷰 컨트롤러를 컨테이너 뷰 컨트롤러에 포함(embed)하세요.

  • UIViewController의 메서드를 직접 호출하세요.

각 방법은 표시(presentation)와 해제(dismissal) 과정에서 서로 다른 정도의 제어를 제공합니다.

Specify presentations visually in your storyboard file

스토리보드에서 세그(segue)를 사용 하는 것이 뷰 컨트롤러를 표시하고 사라지게 하는 권장되는 방법입니다. 세그는 한 뷰 컨트롤러에서 다른 뷰 컨트롤러로 전환의 시각적 표현입니다. 세그는 초기 뷰 컨트롤러에서 발생하는 버튼 탭이나 테이블 행(row) 선택과 같은 동작으로 시작합니다. 동작이 발생하면, UIKit은 세그의 다른 끝에 있는 뷰 컨트롤러를 생성하고 자동으로 표시합니다. 스토리보드에서 세그를 생성하고 구성하기 때문에, 매우 빠르게 변경할 수 있습니다.

컨트롤이나 제스처 인식기처럼 동작 메서드를 구현하는 모든 객체에 세그를 시작하세요. 또한, 테이블 행이나 컬렉션 뷰 셀에서도 세그를 시작할 수 있습니다.

  1. 현재 뷰 컨트롤러에서 컨트롤이나 객체에 우클릭을 하세요.

  2. 커서를 표시하기를 원하는 뷰 컨트롤러로 드래그하세요.

  3. Xcode가 제공하는 리스트에서 원하는 종류의 세그를 선택하세요.

스토리보드는 세그를 뷰 컨트롤러 사이에서 화살표로 보여줍니다. 세그를 선택하면 UIKit이 수행하는 표시 방식을 포함하여 해당 세그에 대한 정보를 보여줍니다. 표시 방식을 변경하거나, 세그 식별자(segue identifier)와 같은 추가 세부 정보 구성할 수 있습니다. Customizing the behavior of segue-based presentations에서 설명한 바와 같이, 런타임에 이 정보를 사용하여 더욱 세부적으로 사용자화할 수 있습니다.

스토리보드에서 어떻게 뷰 컨트롤러를 사라지게 하는지에 대한 자세한 정보는 Dismissing a view controller with an unwind segue를 참조하세요.

Let the current context define presentation technique

동일한 뷰 컨트롤러를 여러 곳에서 재사용하면 잠재적인 문제가 발생합니다: 현재 컨텍스트에 따라 다른 방법로 뷰 컨트롤러를 표시할 수 있습니다. 예를 들어, 어느 경우에는 뷰 컨트롤러를 네비게이션 컨트롤러에 포함하기를 원하거나, 다른 것은 모달(modally)로 표시하고자 할 수 있습니다. UIKit은 현재 컨텍스트에서 가장 적합한 방법으로 뷰 컨트롤러를 표시하도록 하는 UIViewControllershow(_:sender:)showDetailViewController(_:sender:) 메서드로 이 문제를 해결합니다.

show(_:sender:) 또는 showDetailViewController(_:sender:) 메서드를 호출하면, UIKit은 표시하기 위한 가장 적합한 컨텍스트를 결정합니다. 구체적으로 말하면, 이 메서드는 상응하는 show 메서드를 구현한 상위 뷰 컨트롤러를 찾기 위해 targetViewController(forAction:sender:) 메서드를 호출합니다. 상위 뷰 컨트롤러가 해당 메서드를 구현하고 표시 처리를 하기를 원한다면, UIKit은 상위 뷰 컨트롤러의 구현을 호출합니다. UINavigationController 객체의 show(:sender:)_ 메서드 구현은 네비게이션 스택에 새로운 뷰 컨트롤러를 푸시(push)합니다. 어떠한 뷰 컨트롤러가 표시를 처리하지 않으면, UIKit은 뷰 컨트롤러를 모달로 표시합니다.

아래 예제는 새로운 뷰 컨트롤러를 생성하고 show(:sender:)_ 메서드를 사용하여 표시합니다. 이 코드는 세그 종류를 Show로 하여 세그를 만드는 것과 동일합니다.

@IBAction func showSecondViewController() {
	let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let secondVC = storyboard.instantiateViewController(identifier: "SecondViewController")
    
    show(secondVC, sender: self)
}

뷰 컨트롤러를 표시하고 난 후, 어떻게 뷰 컨트롤러를 사라지게 할 지 결정하기 위해 현재 컨텍스트를 사용하세요. dismiss(animated:completion:) 메서드는 항상 제일 적절한 옵션이 아닐 수 있습니다. 예를 들어, 네비게이션 컨트롤러가 뷰 컨트롤러를 네비게이션 스택에 추가한 경우, 해당 메서드를 호출하지 마세요. 대신에, 현재 컨텍스트를 결정하고 응답에 적절한 동작을 하기 위해 presentingViewController, splitViewController, navigationControllertabBarController 프로퍼티를 사용하세요. 해당 응답에는 확인 버튼 또는 UI를 닫는 다른 컨트롤을 숨기기 위해 뷰 컨트롤러의 UI 수정이 포함될 수 있습니다.

⚪️ Note
커스텀 컨테이너 뷰 컨트롤러를 구현할 때, 표시를 처리하기 위해 show(_:sender:)showDetailViewController(_:sender:) 메서드를 구현하세요. 더 자세한 정보는 Creating a custom container view controller를 참조하세요.

Embed a view controller inside a container view controller

컨테이너 뷰 컨트롤러는 하나 이상의 하위 뷰 컨트롤러의 컨텐츠를 포함하고 있으며, 결합된 인터페이스를 화면에 표시합니다. 하위 뷰 컨트롤러를 포함하면 컨테이너에 특화된 방식으로 해당 뷰 컨트롤러를 표시합니다. 예를 들어, 네비게이션 컨트롤러는 처음 하위 뷰 컨트롤러를 화면 밖에 배치시키고 화면 안으로 애니메이션합니다.

표준 UIKit 컨테이너 뷰 컨트롤러는 뷰 컨트롤러를 자식으로 포함하기 위해 세그, show(_:sender:)showDetailViewController(_:sender:) 메서드를 사용합니다. 하위 뷰 컨트롤러를 코드로 추가하거나 삭제하기 위한 추가 API도 정의되어 있습니다. 전환을 처리하기 위해 세그와 show 메서드를 사용하세요. 아래 표에 있는 메서드를 사용하여 앱의 UI를 이전 상태로 복원할 때와 같이 뷰 컨트롤러의 일회성 구성을 수행하세요.

Container
Presentation options
UISplitViewController두 개의 초기 뷰 컨트롤러를 viewControllers 프로퍼티를 사용하여 교체하세요. 첫 번째(주요) 뷰 컨트롤러는 앞쪽(리딩) 패널을 보여주고, 두 번째(자세한) 뷰 컨트롤러는 뒤쪽(트레일링) 패널을 보여줍니다.
UINavigationController네비게이션 스택의 컨텐츠를 viewControllers 프로퍼티를 사용하여 교체하세요. setViewControllers(_:animated:) 메서드를 사용하여 뷰 컨트롤러의 하위 집합을 동시에 추가하거나 삭제하세요.
UITabBarController초기 탭을 viewControllers 프로퍼티를 사용하여 교체하세요. 현재 탭을 동적으로 변경하려면 setViewControllers(_:animated:) 메서드를 사용하세요.
UIPageViewController모든 하위 뷰 컨트롤러를 UIPageViewControllerDataSource 객체를 사용하여 제공하세요.

항상 컨테이너 뷰 컨트롤러의 API를 사용하여 표시된 뷰 컨트롤러를 제거하거나 교체하세요.

Present a view controller modally

앱의 작업 흐름에서 사용자에게 중요한 정보를 환기시키는 것처럼 일시적인 주의를 이끌어내기 위해 모달 표시를 사용하세요. 모달 표시는 표시 스타일에 따라 현재 뷰 컨트롤러 전체나 일부분을 덮습니다. 전체 화면 표시는 항상 이전 컨텐츠를 대체하지만, 시트 스타일 표시는 일부 밑에 있는 컨텐츠를 그대로 보이게 할 수 있습니다. 각 표시 스타일의 실제 모습은 현재 트레잇 환경(trait environment)에 따라 달라집니다.

모달 표시를 구성하려면, 새로운 뷰 컨트롤러를 생성하고 present(_:animated:completion:) 메서드를 호출하세요. 이 메서드는 UIModalPresentationStyle.automatic 스타일과 UIModalTransitionStyle.coverVertical 전환 애니메이션을 사용하여 새로운 뷰 컨트롤러가 원하는 위치로 애니메이션합니다. 해당 스타일을 변경하려면, 표시하려는 뷰 컨트롤러의 modalPresentationStylemodalTransitionStyle 프로퍼티를 수정하세요. 아래 코드는 크로스 디졸브(cross-dissolve) 애니메이션을 사용한 전체 화면 표시를 생성하고자 두 가지 스타일 모두 변경합니다.

@IBAction func presentSecondViewController() {
	let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let secondVC = storyboard.instantiateViewController(identifier: "SecondViewController")
    
    secondVC.modalPresentationStyle = .fullScreen
    secondVC.modalTransitionStyle = .crossDissolve
    
    present(secondVC, animated: true, completion: nil)
}

모달로 표시된 뷰 컨트롤러를 사라지게 하려면, 뷰 컨트롤러의 dismiss(animated:completion:) 메서드를 호출하세요.

참교 자료

profile
rlarjsdn3.github.io

0개의 댓글