Unwind segue는 무엇이며 어떻게 사용합니까?


584

iOS 6 및 Xcode 4.5에는 "Unwind Segue"라는 새로운 기능이 있습니다.

풀기 segue를 사용하면 스토리 보드에서 기존 장면 인스턴스로 전환 할 수 있습니다

Xcode 4.5 릴리스 노트의이 간단한 항목 외에도 UIViewController에는 몇 가지 새로운 메소드가있는 것 같습니다.

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

풀기 segue는 어떻게 작동하며 무엇을 사용할 수 있습니까?

답변:


1267

간단히 말해서

언 와인드 SEGUE (라고도 종료 SEGUE는 (당신이 탐색 모음에서 탐색 항목을 불쑥 들어 갔던 팝 오버를 폐쇄 또는 모달 발표 뷰 컨트롤러를 기각 것처럼)) 푸시, 모달 또는 팝 오버 segues를 탐색 뒷면에 사용할 수 있습니다. 또한 하나의 풀기 동작으로 탐색 계층에서 여러 단계를 "뒤로 이동"하는 것과 같이 일련의 푸시 / 모달 / 팝 오버 segue를 실제로 풀 수 있습니다.

풀기 segue를 수행 할 때는 풀려는 뷰 컨트롤러의 작업 방법 인 작업을 지정해야합니다.

목표 -C :

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

빠른:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

이 조치 방법의 이름은 스토리 보드에서 풀기 segue를 작성할 때 사용됩니다. 또한이 메소드는 unwind segue가 수행되기 직전에 호출됩니다. 전달 된 UIStoryboardSegue파라미터 에서 소스 뷰 컨트롤러 를 가져 와서 segue를 시작한 뷰 컨트롤러와 상호 작용할 수 있습니다 (예 : 모달 뷰 컨트롤러의 속성 값 가져 오기). 이러한 관점에서, 상기 방법은 유사한 기능으로서 갖고 prepareForSegue:의 방법 UIViewController.

iOS 8 업데이트 : Unwind segue는 Show and Show Detail 과 같은 iOS 8의 적응 형 segue 와도 작동 합니다.

네비게이션 컨트롤러와 3 개의 자식 뷰 컨트롤러가있는 스토리 보드를 만들어 보자.

여기에 이미지 설명을 입력하십시오

Green View Controller에서 Red View Controller로 되감기 (다시 탐색) 할 수 있습니다. 파란색에서 녹색을 통해 녹색 또는 빨간색으로 긴장을 풀 수 있습니다. 당신이 빨간색과 녹색으로 특수 액션 메소드를 추가해야합니다 풀기 사용하려면, 여기에 예하면 레드의 조치 방법은 다음과 같다 :

목표 -C :

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

빠른:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

동작 방법이 추가 된 후, 종료 아이콘으로 드래그하여 스토리 보드에서 풀기 segue를 정의 할 수 있습니다. 버튼을 눌렀을 때 녹색에서 빨간색으로 풀리려고합니다.

여기에 이미지 설명을 입력하십시오

풀려는 뷰 컨트롤러에 정의 된 작업을 선택해야합니다.

여기에 이미지 설명을 입력하십시오

탐색 스택에서 "2 단계 떨어져"있는 파란색에서 빨간색으로 해제 할 수도 있습니다. 열쇠는 올바른 풀기 동작을 선택하는 것입니다.

unwind segue가 수행되기 전에 action 메소드가 호출됩니다. 이 예에서는 녹색과 파란색 모두에서 풀기 segue를 빨간색으로 정의했습니다. UIStoryboardSegue 매개 변수를 통해 조치 메소드에서 해제 소스에 액세스 할 수 있습니다.

목표 -C :

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

빠른:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

풀림은 푸시 / 모달 세구의 조합을 통해 작동합니다. 예를 들어, 모달 segue를 가진 또 다른 Yellow view 컨트롤러를 추가했다면, 한 번에 Yellow에서 Red로 다시 풀 수 있습니다.

여기에 이미지 설명을 입력하십시오

코드에서 풀기

뷰 컨트롤러의 종료 기호에 무언가를 드래그하여 풀기 segue를 정의하면 문서 개요에 새로운 segue가 나타납니다.

여기에 이미지 설명을 입력하십시오

segue를 선택하고 Attributes Inspector로 이동하면 "식별자"속성이 표시됩니다. 이것을 사용하여 segue에 고유 식별자를 제공하십시오.

여기에 이미지 설명을 입력하십시오

그 후, 다른 segue와 마찬가지로 unwind segue를 코드에서 수행 할 수 있습니다.

목표 -C :

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

빠른:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

12
좋은 답변 +1. 그것들은 정말로 멋지게 들리지만 같은 방법 dismissViewControllerAnimated:completion:이나 popViewControllerAnimated:같은 것을 달성 할 수 없습니까?
샘 스펜서

32
물론 가능합니다. 그러나 스토리 보드를 사용하는 경우, 긴장을 푸는 segue는 종종 훨씬 적은 코드로 동일한 것을 달성 할 수 있습니다. 실제로 이제 코드를 작성하지 않고 모달 표시 뷰 컨트롤러를 닫을 수 있습니다. 물론 코드에서 컨트롤러를 닫는 것이 옳은 경우가 많습니다.
Imre Kelényi

7
액션 파일을 헤더 파일에 추가하지 않으면 Storyboard에서 알 수 없습니다.
Kyle C

17
이상의 또 다른 장점 dismissViewControllerAnimated:completion:또는 popViewControllerAnimated:당신이 당신이 긴장을 풀기있다 뷰 컨트롤러에 추가 된 메소드가 호출되어이며 제시된 뷰 컨트롤러를 알 수있는 쉬운 방법을 가지고 있도록 제시 뷰 컨트롤러에게 제시된 뷰 컨트롤러의 대리자를하지 않고도 완료 .
honus

8
약간의 수정을 제안 할 수 있습니까? RedViewController.m에-(IBAction) unwindTRed : (UIStoryboardSegue *) unwindSegue를 넣은다는 것은 명백히 명확하지 않았으며, 이는 스토리 보드의 녹색 종료 버튼 "모든"에서 보편적으로 사용할 수 있습니다. 환상적인 답변이며 이제 다른 문제에 사용합니다. 감사!
John Ballinger

166

StoryBoard에서 unwind segue를 사용하는 방법은 ...

1 단계)

풀려는 뷰 컨트롤러의 코드로 이동하여 다음 추가하십시오.

목표 -C

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

Obj-C의 .h 파일에도이 메소드를 선언하십시오

빠른

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

2 단계)

스토리 보드에서 긴장을 풀고 자하는 뷰로 이동하여 소스 뷰의 오른쪽 상단에있는 작은 오렌지색 "EXIT"아이콘까지 버튼이나 다른 것에서 segue를 드래그하십시오.

여기에 이미지 설명을 입력하십시오

이제 "-unwindToViewControllerNameHere"에 연결하는 옵션이 있어야합니다.

그게 다야, 버튼을 눌렀을 때 segue가 풀린다.


5
Xcode 4.5 및 이전 버전에서는 헤더에 IBAction을 선언해야한다는 것을 알았습니다. 이것이 여전히 사실인지 모르겠습니다.
Steven Fisher

2
스토리 보드없이 프로그래밍 방식으로 2 단계를 수행 할 수있는 방법이 있습니까? 내 스토리 보드 (인터페이스 빌더)가 엉망이되어 풀리지 않은 segues (xcode 버그)가 표시되지 않습니다.
Van Du Tran

46

풀기 segues는 여러 segue를 통해 "현재"view controller에 도착한 일부 view controller로 "돌아가는"데 사용됩니다.

당신이 뭔가 a를 가지고 상상 MyNavControllerA루트 뷰 컨트롤러로. 이제 푸시 세그를 사용하여에 B. 이제 내비게이션 컨트롤러의 viewControllers배열 에 A와 B가 있고 B가 보입니다. 지금 당신은 선물C 모달 합니다.

풀기 segue를 사용하면 기본적으로 모달 segue를 "실행 취소"하여 "뒤로" (예 : 모달 표시 뷰 컨트롤러 C를 해제) 풀 수 있습니다 B. 루트 뷰 컨트롤러까지 다시 풀 수 있습니다.A모달 segue와 push segue를 모두 실행 취소 .

풀기 segue를 사용하면 쉽게 추적 할 수 있습니다. 예를 들어 iOS 6 이전에는 제시된 뷰 컨트롤러를 해제하는 가장 좋은 방법은 제시된 뷰 컨트롤러를 제시된 뷰 컨트롤러의 대리자로 설정 한 다음 사용자 정의 대리자 메서드를 호출하여 presentViewController를 닫는 것 입니다. 귀찮고 복잡한 소리? 그렇습니다. 그것이 긴장을 푸는 segues가 좋은 이유입니다.


7
dismissViewController:animated제시된 컨트롤러에서 전화 를 걸 수 있습니다 . 위임하지 않아도됩니다. 물론 데이터를 다시 전달해야하는 경우 위임 또는 다른 방법이 필요합니다.
mxcl

3
dismissViewController:animated:제시된 컨트롤러에서 호출 할 수는 있지만 "양호한 모범 사례"는 실제로 제시 컨트롤러에서 델리게이트 메서드를 호출하여이를 위해이를 수행하는 것입니다.
크리스 놀렛

36

여기에 다른 답변에서 언급되지 않은 것은 초기 segue의 출처를 모르는 경우 풀기 처리 방법입니다. 예를 들어, 두 개의 서로 다른 뷰 컨트롤러 ( AB ) 에서 모달로 표시 하는 도움말 뷰 컨트롤러 ( H )가 있다고 가정합니다 .

AH
BH

올바른 뷰 컨트롤러로 돌아가도록 풀기 segue를 어떻게 설정합니까? 대답은 같은 이름으로 AB 에서 풀기 동작을 선언하는 것입니다 .

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

이 방법으로 풀면 뷰 컨트롤러 ( A 또는 B )가 segue를 시작하고 다시 돌아갑니다.

즉, SEGUE가 오는 곳 기술과 언 와인드 행동의 생각 에서 오히려가는 곳보다.


2
이 정보에 감사드립니다, 나는 이것을 찾고있었습니다.
Madhu

2
이 솔루션을 이미 구현하고 있기 때문에이 정보를 언급하는 것이 정말 좋습니다. 귀하의 지원에 감사드립니다.
Amr Angry

이것은 훌륭한 정보입니다! 대단히 감사합니다!
Dominique Vial

24

스위프트 iOS :

1 단계 :이 방법을 MASTER 컨트롤러보기에 정의하십시오. 다시 가고 싶은 곳 :

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

2 단계 : (StoryBoard) SLAVE / CHILD EXIT 버튼을 마우스 오른쪽 버튼으로 클릭하고 "goToSideMenu"를 선택하십시오. 연결 조치 버튼을 클릭하면 마스터 컨트롤러보기로 돌아갑니다.

여기에 이미지 설명을 입력하십시오 3 단계 : 빌드 및 실행 ...


1

예를 들어 viewControllerB에서 viewControllerA로 이동하면 아래의 viewControllerA에서 대리자가 호출하고 데이터가 공유됩니다.

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • Seague 소스 뷰 컨트롤러 풀기 (Exit Button을 VC의 종료 아이콘에 연결하고 unwindseague에 연결해야합니다.

여기에 이미지 설명을 입력하십시오

  • SeaController 완료-> viewControllerA의 TextLabel이 변경되었습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.