[iphone] 제시된보기 컨트롤러 닫기

이론적 인 질문이 있습니다. 이제 Apple의 ViewController 가이드를 읽고 있습니다.

그들은 작성했다:

제시된 뷰 컨트롤러를 해제 할 때 선호되는 접근 방식은 제시 뷰 컨트롤러가 해제하도록하는 것입니다. 즉, 가능할 때마다 뷰 컨트롤러를 표시 한 동일한 뷰 컨트롤러가이를 해제 할 책임이 있습니다. 프리젠 테이션 뷰 컨트롤러에게 제시된 뷰 컨트롤러를 해제해야 함을 알리는 몇 가지 기술이 있지만, 선호하는 기법은 위임입니다.

하지만 제시된 VC에서 프로토콜을 생성하고 델리게이트 변수를 추가해야하는 이유를 설명 할 수 없습니다. 제시된 뷰 컨트롤러 메서드 에서 간단한 호출 대신 제시된 VC를 해제하기 위해 VC를 제시 할 때 델리게이트 메서드를 생성해야합니다.

[self dismissViewControllerAnimated:NO completion:nil]?

첫 번째 선택이 더 나은 이유는 무엇입니까? Apple이 권장하는 이유는 무엇입니까?



답변

나는 애플이 잠재적으로 복잡한 API 조각을 위해 약간의 등을 덮고 있다고 생각합니다.

  [self dismissViewControllerAnimated:NO completion:nil]

실제로 약간의 바이올린입니다. 제시된 뷰 컨트롤러에서 합법적으로 이것을 호출 할 수 있지만, 그것이하는 일은 메시지를 제시하는 뷰 컨트롤러로 전달하는 것뿐입니다. VC를 무시하는 것 이상으로 무언가를하고 싶다면 이것을 알아야하고, 델리게이트 메서드와 거의 같은 방식으로 처리해야합니다. 위임 방법.

아마도 그들은 이것이 어떻게 결합되는지 실제로 이해하지 못하는 사람들에 의해 많은 나쁜 코드를 발견했을 것입니다.

하지만 물론, 당신이해야 할 일이 그 일을 무시하는 것이라면 계속 진행하십시오.

내 접근 방식은 타협입니다. 적어도 무슨 일이 일어나고 있는지 상기시켜줍니다.

  [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]

[빠른]

  self.presentingViewController?.dismiss(animated: false, completion:nil)


답변

Swift 3 업데이트

나는 현재 (제공된) View Controller를 무시하고 싶었습니다. 나는 같은 목적으로 여기에 오는 모든 사람들을 위해이 대답을 만들고 있습니다.

네비게이션 컨트롤러

내비게이션 컨트롤러를 사용하는 경우 매우 쉽습니다.

이전 뷰 컨트롤러로 돌아갑니다.

// Swift
self.navigationController?.popViewController(animated: true)

// Objective-C
[self.navigationController popViewControllerAnimated:YES];

루트 뷰 컨트롤러로 돌아갑니다.

// Swift
self.navigationController?.popToRootViewController(animated: true)

// Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];

( 이 답변 덕분에 Objective-C에 대한 에 .)

모달 뷰 컨트롤러

뷰 컨트롤러가 모달로 표시되면 다음을 호출하여 두 번째 뷰 컨트롤러에서 해제 할 수 있습니다.

// Swift
self.dismiss(animated: true, completion: nil)

// Objective-C
[self dismissViewControllerAnimated:YES completion:nil];

설명서를 말한다

프레젠테이션 뷰 컨트롤러는 자신이 제시 한 뷰 컨트롤러를 해제 할 책임이 있습니다. 제시된 뷰 컨트롤러 자체에서이 메서드를 호출하면 UIKit은 제시 뷰 컨트롤러에게 해제를 처리하도록 요청합니다.

따라서 제시된 뷰 컨트롤러가 자체적으로 호출하도록 작동합니다. 다음 은 전체 예입니다.

대표자

OP의 질문은 델리게이트를 사용하여 뷰를 무시하는 복잡성에 관한 것이 었습니다.

지금까지는 일반적으로 내비게이션 컨트롤러 나 모달 뷰 컨트롤러가 있으므로 델리게이트 를 사용할 필요가 없었지만 나중에 델리게이트 패턴 을 사용해야 하는 경우 업데이트를 추가하겠습니다.


답변

이는 뷰 컨트롤러 재사용을위한 것입니다.

뷰 컨트롤러는 그것이 모달로 표시되는지, 탐색 컨트롤러에 푸시되는지 또는 무엇이든 상관하지 않아야합니다. 뷰 컨트롤러가 자동으로 해제되면 모달로 표시되는 것으로 간주됩니다. 해당 뷰 컨트롤러를 탐색 컨트롤러에 푸시 할 수 없습니다.

프로토콜을 구현하면 부모 뷰 컨트롤러가 표시 / 푸시 및 해제 / 팝 방식을 결정할 수 있습니다.


답변

이 시도:

[self dismissViewControllerAnimated:true completion:nil];


답변

내 경험상 어느에서나 해산해야 할 때 유용 합니다. 당신이 원하는의 ViewController와 일축를하는 각의 ViewController에 대해 서로 다른 작업을 수행합니다. 프로토콜을 채택하는 모든 viewController는 자체 방식으로 뷰를 닫을 수 있습니다. (ipad 대 iphone 또는 다른보기에서 닫을 때 다른 데이터 전달, 닫을 때 다른 메소드 호출 등)

편집하다:

따라서 명확히하기 위해보기를 닫고 싶은 경우 위임 프로토콜을 설정할 필요가 없습니다. 다른 프리젠 테이션 뷰 컨트롤러에서 해제 한 후 다른 작업을 수행해야하는 경우 대리자를 사용하는 가장 좋은 방법입니다.


답변

View Controller 프로그래밍 가이드 , “View Controller가 다른 View Controller를 나타내는 방법” 에서 인용 .

제시된 뷰 컨트롤러 체인의 각 뷰 컨트롤러에는 체인에서 주변의 다른 객체에 대한 포인터가 있습니다. 즉, 다른 뷰 컨트롤러를 제공하는 제시된 뷰 컨트롤러는 presentingViewController 및 presentationViewController 속성 모두에 유효한 개체를 가지고 있습니다. 이러한 관계를 사용하여 필요에 따라 뷰 컨트롤러 체인을 추적 할 수 있습니다. 예를 들어 사용자가 현재 작업을 취소하는 경우 첫 번째로 제시된 뷰 컨트롤러를 해제하여 체인의 모든 개체를 제거 할 수 있습니다. 뷰 컨트롤러를 해제하면 해당 뷰 컨트롤러뿐만 아니라 표시 한 뷰 컨트롤러도 모두 해제됩니다.

그래서 한편으로는 균형 잡힌 디자인, 좋은 디커플링 등을 만듭니다. 그러나 다른 한편으로는 탐색의 특정 지점으로 빠르게 돌아갈 수 있기 때문에 매우 실용적입니다.

비록 나는 개인적으로 제시하는 뷰 컨트롤러 트리를 뒤로 넘기 려고하기 보다는 풀기 세그를 사용하는 편이 더 낫다. 애플이이 챕터에서 인용 한 내용이다.


답변

한 가지 요점은 이것이 좋은 코딩 접근 방식이라는 것입니다. OOPSRP, 관심사 분리 등 많은 원칙을 충족합니다 .

따라서 뷰를 제공하는 뷰 컨트롤러는 뷰를 해제하는 컨트롤러 여야합니다.

마찬가지로 집을 빌려주는 부동산 회사가 집을 되 찾을 권한이 있어야합니다.