2016-07-25 3 views
1

나는 세 개의 뷰 컨트롤러 시리즈를 가지고 있는데 처음 두 개는 UINavigationController에 래핑되고 기본값은 Main.storyboard 파일로 관리됩니다. 각각 AB이라고합시다. 파일 전체에 걸쳐 더 많은 뷰 컨트롤러가 있으며, 각 뷰 컨트롤러는 개별적으로 인스턴스화되고 개별적으로 관리됩니다. 그러나 모든 코드 솔루션으로 이동시키는 작업을 진행하고 있습니다. 이미 코드 (C)에있는 세 번째 뷰 컨트롤러는 다양한 시간에 인스턴스화되어 B으로 표시되는 뷰 컨트롤러입니다.프로그래밍 방식으로 unwind segue를 만들고 사용할 수있는 방법이 있습니까?

A 및 은 인터페이스 빌더에서 정상적인 연결 관계 설정을 가지고 코드를 통해 호출됩니다. 나는 CB에서 코드 (인스턴스화 및 presentViewController(_:))를 통해 동일하게 처리합니다. C의 조치로 인해 B의 존재 이유가 무효화되는 경우가 몇 가지 있습니다. 따라서 두 가지를 모두 취소해야합니다.

지금까지, 나는 C에서 dismissViewControllerAnimated(_:)를 호출 한 다음 B의이 기각할지 여부를 viewDidAppear(_:)에 확인하고, 같은 방법 그렇다면 기각. 이 과정에서 사용자는 VC 계층 구조를 통해 다시 던져지며 빈보기가 어디서 왔는지 다시보고 더 이상 작동하지 않는 컨트롤을 실험 할 시간을 남겨두고 응용 프로그램을 중단시킬 수 있습니다. 이것은 내가 버리고 싶은 다소 혼란스러운 사용자 경험입니다. 모든 것을 간단하게 비활성화 할 수는 있지만 컨트롤을 피할 수 있다면 많은 어려움을 피할 수 있습니다 ...

IB는 전체 VC 계층 구조를 동시에 해제 할 수있는 "unwind segues"를 지원한다는 것을 알고 있습니다. , 그것들은 스토리 보드에서 뷰 컨트롤러를 다루는 것만 보입니다. 이 계층 구조의 일부가 UINavigationController에 포함되어 있다고 생각하면서 이미 수행 한 작업을 대부분 되돌릴 필요없이 프로그래밍 방식으로이 동작을 수행 할 수있는 방법이 있습니까? (A 모든 것을 닫을 수 있습니까?)


UPDATE :

그래서, 내가 해고가 제시 뷰에 대한 참조를 전달하고이 떠나기 전에 SEGUE을 기각 호출하여 제대로 작동있어. 그 접근 방식은 자체 문제와 네비게이션 컨트롤러의 기이함과 함께 왔지만, 약간의 조정으로 유용 할 수 있습니다.

솔직히이 시점에서 기능을 완전히 제거하는 것이 가장 편리 할 것입니다.

과학적으로, 나는 에테르 길을 결정할 때까지 계속 지켜보고이 방법으로 인터넷 검색을하는 사람에게 대답을하겠습니다.


UPDATE :

으으 ...이 코드가 생각보다 나이가되었다 보인다. 실제로 사용자 정의 모달 애니메이션을 B으로 보내고 나가기 위해 두 개의 네비게이션 컨트롤러가 있습니다. 여기에는 사용자 정의 되감기 세그먼트가 있습니다 (거기에 있음). 원하는 애니메이션을 얻으려면 스토리 보드에 C을 던져 맞춤 설정을 해보세요.

애니메이션에 신경 쓰지 않는다면 사용자 정의 풀기에서 애니메이션을 비활성화하면 BC이 즉시 사라지고 함께 사라집니다. 문제는, 내 취향에 약간의 충격이 ...

vacawama의 제안은 실제로 많은 의미를 가지며, 문서를 확인하지 않으면 바로 나를 제공합니다! UIViewController은 이미 presentingViewController에 대한 참조를 유지합니다. 다시 2로 돌아 가면 핀치가 생기고 그 계층 구조를 다시 올라가서 내가 원한 것을 기각합니다. 애니메이션과 같은 매력없는 작품은 전혀 일어나지 않습니다 ...

나는 지금까지 발견 한 내용으로 곧 여기에 답변을 게시 할 것입니다.

, DR

사용 IB와 Ctrl 키 '종료'로 (노란색) 'C'뷰 컨트롤러,

선택 'prepareForUnwind';

+2

스토리 보드없이 단절 기호를 사용하거나, 정상적으로 또는 되감기 할 수 없습니다. 네비게이션 컨트롤러를 가지고 있기 때문에, 직접적으로 'viewControllers' 속성을 조작 할 수 있습니다. – Paulw11

+0

"모든 코드 솔루션으로 옮기기 위해 노력하고 있습니다 ..."왜 그렇게하고 있습니까? 프로젝트를 유지 관리하기가 더 어려워지고 작업량도 늘어납니다. – Rob

+0

@ Paulw11 그건 내가 생각해 봤지만, 아직 나 자신을 시험 할 기회가 없었어. 내가'C '를 표시 할 때 nav 컨트롤러에 대한 참조를 전달하겠습니까? 나는 지금 그것을 시도하고 내가 찾은 것을 가지고 돌아올 것입니다. – SeizeTheDay

답변

1

따라서 과학이 우세하며 해결책이 있습니다.

커스텀 씨구 (segues)와 애니메이터 (animators)를 쓰고 싶지 않으면 정말 고통 스럽습니다. 궁극적으로 그렇게 할 것이지만 지금은 기능을 전혀 사용하지 않는 것이 더 유리합니다. (내 끝을 토글하는 것은 쉽다.

B에서 segue (사용자 정의를 사용합니다)를 실행 한 다음 C을 해고하는 것이 애니메이션을 사용하지 않는 한 그 트릭을 수행 한 것으로 나타났습니다. 전혀 예상치 못한 일이 없습니다! goAllTheWayBack()C의 동등한에서

presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil) 

:

또한, 내가 (둘 다 사용자 정의 SEGUE하지 않습니다 그래서 애니메이션이 중요하지 않습니다) 실행을 한 줄에 같은 효과를 얻을 수 있습니다.

총체적이지만 일이 끝났습니다. 조금 더 조정하면 실제로 긴장을 푸는 데 스토리 보드를 사용하고 커스텀 애니메이터를 작성하는 것처럼 담요에있는 돼지보다 더 멋지게 보일 것입니다.

나는이 말을 선과 죽이라고 선언하려고합니다. 모두에게 감사드립니다!

0

Atomic Object's approach

TL를 시도

풀다림에 식별자를 지정하십시오.

다음 푸시 알림을 수행 할 수 있습니다. 프로그램 적으로 'B'뷰 컨트롤러를 건너 뜁니다.

+0

위에서 언급했듯이 지금은 스토리 보드에서 'C'를 꺼내려고합니다. 그래서 아니에요, 나는 IB에서 그것을 위해 긴장을 푸는 시도를하지 않았습니다. – SeizeTheDay

+0

나는 그것을 잘못 읽고, 나의 실수를 사과한다. 나는 섹스는 IB에서만 가능하다고 생각한다. http://stackoverflow.com/questions/9674685/creating-a-segue-programmatically – FullMetalFist

+0

의미와 걱정이 없다. 모든 일을 그냥 기각하는 좋은 방법이 있는지 궁금해합니다 ... – SeizeTheDay