프로그래밍 방식으로 Unwind segue를 수행하는 방법은 무엇입니까?


307

스토리 보드를 사용하면 매우 쉽습니다. 액션을 "종료"로 드래그하면됩니다. 그러나 내 코드에서 어떻게 호출해야합니까?


33
나는 이것이 유효한 질문이라고 생각한다 – 나는 그것을 스스로 가지고 있었다. 1. 수동 segue (파일 소유자에서 Ctrl- 드래그를 끌어서 이동)를 작성하고, IB에 이름을 지정한 다음, 3. 코드에서 정상적인 -performSegueWithIdentifier : sender :를 수행하여 풀기 segue를 프로그래밍 방식으로 수행 할 수 있습니다.
Yang Meyer

6
폐쇄 된 IMO가 아니어야합니다. 이 질문을 닫기로 투표 한 사용자는 Obj-C / Cocoa Touch 배경이없는 것 같습니다.
LJ 윌슨

양 : 어떻게 이름을 지어 주나요?
sarfata

난 그냥 [self dismissViewControllerAnimated : YES complete : nil]; 프로그래밍 방식으로 종료합니다. 나는 그것이 올바른 길인지 아닌지 모른다.
tangqiaoboy

1
sarfata : 먼저 viewcontroller에서 "Exit"로 ctrl-drag하여 "manual unwind segue"를 만듭니다. 그런 다음 문서 개요에서 segue를 찾을 수 있습니다.
huggie

답변:


283
  1. 수동 세구를 작성하십시오 ( ctrl파일 소유자에서 -drag하여 종료).
  2. 녹색 EXIT 버튼 아래 왼쪽 컨트롤러 메뉴에서 선택하십시오.

녹색 EXIT 버튼 아래 왼쪽 컨트롤러 메뉴에서 선택하십시오

긴장을 풀려면 Segue의 이름을 삽입하십시오.

그런 다음, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.당신의 말과 함께 확인하십시오.


25
1) "파일 소유자"-그 오래된 용어가 아닙니까? 뷰 컨트롤러에서 종료 아이콘으로 드래그를 제어하는 ​​데 도움이되었습니다. 2) Xcode는 UIStoryboardSegue 인수를 취하는 IBAction의 인터페이스에서 선언을 찾고 있습니다. WWDC 2012 세션 407 강연에서 언급하지 않았고 해당 코드를 붙여 넣지 않았습니다. 코드가 없으면 제어 아이콘을 끌 때 종료 아이콘이 활성화되지 않습니다. 3) 큰 빨간색 화살표가 끝날 때 동작 필드에서 "가서"화살표를 칠 수 있다는 것이 매우 좋습니다!
tobinjim

71
나처럼 여전히이 답변을 구현하는 데 문제가있는 사람은 github.com/bradley/iOSUnwindSegue 프로그래밍 방식 으로보다 철저한 연습과 예를 모았 습니다. 이의 시간과보고에 대한 작업 설정이 날 수 있습니다).
bradleygriffith

3
@bradleygriffith 당신은 놀랍게도 정말 대단합니다. 위대한 연습을 주셔서 감사합니다!
Eli_Rozen

7
@ bradleygriffith 나는 당신이 이것을 대답 할 수 있기를 바랍니다. 귀하의 독특한 기여는 어떤 뷰 컨트롤러가 어떤 코드를 얻는 지 확립 하는 것이 었 습니다 . 어디서나 찾을 수 없습니다. 감사!
Aaron Vegh

3
여전히 문제가있는 사람에게는 IBACTION이 현재 사용중인 컨트롤러가 아닌 반환 컨트롤러에 있어야한다는 것입니다. @ bradleygriffith는 GitHub에서 철자를 표시하지만 그 사실을 보지 못했습니다. 다른 곳에서 언급했습니다. 그 부분이 중요합니다.
Axeva

163

Objective C와 Swift에 대한 완전한 대답은 다음과 같습니다.

1) IBAction목적지 뷰 컨트롤러에서 풀기 segue를 만듭니다 (segue하려는 위치). 구현 파일의 아무 곳이나.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) 소스 뷰 컨트롤러 (원하는 컨트롤러)에서 "활동 이름"에서 ⌃ + 드래그하여 종료합니다. 팝업의 1 단계에서 생성 된 풀기 segue가 표시되어야합니다. 표시되지 않으면 1 단계를 검토하십시오. 팝업에서 unwindToContainerVC :를 선택하거나 소스 컨트롤러를 unwind IBAction에 연결하기 위해 메소드 이름을 지정하십시오.

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

3) 스토리 보드의 소스 뷰 컨트롤러 문서 개요 (아래 근처에 나열 됨)에서 segue를 선택하고 식별자를 지정하십시오 .

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

4) 소스 보기 컨트롤러 에서이 메소드를 사용 하여 해제 해제 segue 이름을 대체하여 해제 해제 segue를 호출하십시오 .

// 목표 C

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

// 빠른

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. unwind 메서드에서 segue 매개 변수의 sourceViewController 속성을 사용하여 소스 컨트롤러의 노출 된 속성에 액세스하십시오. 또한 프레임 워크가 소스 컨트롤러 해제를 처리합니다. 이를 확인하려면 소스 컨트롤러에 dealloc 메소드를 추가하고 일단 종료되면 실행되어야하는 로그 메시지를 추가하십시오. dealloc이 실행되지 않으면 유지주기가있을 수 있습니다.


2
내 프로그램이 작동하지 않고 호출되지도 않음(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
이 솔루션은 뷰 컨트롤러가
풀릴

@mnl 정확히 무슨 말을하는지 모르겠지만 스토리 보드 장면이나 펜촉과 함께 작동합니다. 코드에서 뷰 컨트롤러 장면을 생성하는 경우 IB를 이름으로 "반환"하는 메소드를 사용하지 않을 것입니다. 이는 코드와 IB 간의 통신 목적으로 사용되기 때문에 어쨌든 무효입니다. 그것은 당신의 의견을 다루고 있습니까?
smileBot

1
ctrl+drag에서 ViewController를 보여주는 사진 Exit이 매우 도움이되었습니다. 감사!
kbpontius

Swift 4.2의 경우 : self.performSegue (withIdentifier : "unwindToVC", 발신자 : self)
Reefwing

81

bradleygriffith대답은 훌륭했습니다. 10 단계를 거쳐 단순화를위한 스크린 샷을 만들었습니다. 이것은 Xcode 6의 스크린 샷입니다.

  1. 주황색 아이콘에서 빨간색 끝내기 아이콘으로 Control- 드래그하면보기에 아무 작업 / 버튼없이 풀기가 해제됩니다.

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

  1. 그런 다음 unwind segue사이드 바에서를 선택하십시오 .

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

  1. Segue 식별자 문자열을 설정하십시오.

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

  1. 코드에서 해당 식별자에 액세스하십시오.
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
우선 풀기 방법이에 포함되어 있어야합니다 UIViewController. 그런 다음 솔루션은 작동합니다
알렉스 C10의에게

5
그리고이 새로운 segue에 식별자를 설정해야합니다! 잊지 마세요.
kraag22

1
프로그래밍 방식으로 소스 뷰 컨트롤러에서 "종료"연결을 만들 수 있습니까?
앤드류 키르 나

13

나는 [self dismissViewControllerAnimated: YES completion: nil];당신을 부름으로 돌려 보낼 것을 사용 했다 ViewController.


6
Larry, 이전 뷰 컨트롤러 (예 : 현재 종료중인 컨트롤러)로 돌아가려면 완벽하게 유효한 방법입니다. Xcode 4.5의 새로운 기능은 프레젠테이션 순서의 한 뷰 컨트롤러에서 훨씬 이전의 뷰 컨트롤러로 "풀기"하는 기능이기 때문에 문제가 발생했습니다. 자세한 내용은 WWDC 2012 세션 407을 참조하십시오.
tobinjim

11

Unwind Segue에 대한 Apple 기술 노트의 텍스트 인용 : 프로그래밍 방식으로 만 트리거되는 unwind segue를 추가하려면 장면의보기 컨트롤러 아이콘에서 종료 아이콘으로 control + 드래그 한 다음 팝업 메뉴에서 새로운 segue에 대한 unwind 액션을 선택하십시오.

기술 노트 링크


6

위의 Vishal Chaudhry의 답변이 저에게 효과적이었습니다. 또한 다음을 사용하여 수동으로 seque를 트리거하기 위해 추가 할 것입니다.

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

ViewController 내에서 스토리 보드의 ViewController 장면과 RHS의 속성보기에서 풀기 segue를 선택해야합니다. 식별자 필드에 코드에서 참조하는 이름이 포함되어 있는지 확인합니다 (위 예의 "mySegueName"). ).

이 단계를 생략하면 위의 행에서 seque 이름을 알 수 없다는 예외가 발생합니다.


3

관심있는 사람들을 위해 ios6 이전 버전에서 작동하는 이전 버전과 호환되는 솔루션 :

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
풀기 segue는 내비게이션 컨트롤러 스택에서 특정 클래스로 돌아가는 것보다 훨씬 더 많은 일을합니다.
Steve Moser

2

스위프트 4 :

1. 풀기 원하는 컨트롤러 내에 segue를 사용 하여 @IBAction 을 만듭니다 .

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. 스토리 보드의 컨트롤러에서 ctrl +로 이동 (풀기)하려는 경우 컨트롤러 기호에서 드래그하여 기호를 종료하고 앞에서 만든 방법을 선택합니다.

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

3. 이제 문서 개요에 "Unwind segue ...."라는 제목의 새로운 줄이 있음을 알 수 있습니다. 이제이 줄을 클릭하고 속성 관리자를 열어 식별자를 설정해야합니다 (제 경우에는 unwindSegueIdentifier ).

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

4. 거의 끝났습니다! 이제 풀기 원하는 뷰 컨트롤러를 열고 segue를 수행 할 메소드를 작성해야합니다. 예를 들어, 당신은 버튼을 추가 할 수 있습니다와 코드로 연결 @IBAction 그 후, 안쪽이 IBAction를 추가 perfromSegue (withIdentifier : 보낸 사람 : 방법 :

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

이것이 당신이해야 할 전부입니다!


프로그래밍 방식으로 소스 뷰 컨트롤러에서 "종료"연결을 만들 수 있습니까?
앤드류 키르 나

1

스위프트 4.2, Xcode 10+

스토리 보드를 통해 설정되지 않은 VC 로이 작업을 수행하는 방법에 대해 궁금한 사람들 ( "프로그래밍 방식으로"+ "언 윈드 세구"를 검색 하여이 질문에 나오는 사람들).

프로그래밍 방식으로 풀기 segue를 설정할 수없는 경우 가장 간단한 유일한 프로그래밍 방식 솔루션은 다음을 호출하는 것입니다.

navigationController?.popToRootViewController(animated: true)

스택의 모든 뷰 컨트롤러가 루트 뷰 컨트롤러로 다시 나타납니다.


탐색 스택에서 최상위 뷰 컨트롤러 만 팝업하려면 다음을 사용하십시오.

navigationController?.popViewController(animated: true)


1
그것은 보통 당신이 원하는 것 이상입니다-다시 팝업하기 만하면됩니다 : [self.navigationController popViewControllerAnimated : YES];
앤디 와인 스타 인

사실, 나는 그것을 내 대답에 추가했습니다-감사합니다 @AndyWeinstein
10623169

0

참고 : @Vadim의 답변이 View Controller 내에서 호출 된 수동 해제 해제 작업을 수행하려면 다음 명령을 배치해야합니다.

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

재정의 된 클래스 메서드 viewDidAppear 내부 :

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

viewDidLoad 또는 viewWillAppear 와 같은 다른 ViewController 메소드에 넣으면 무시됩니다.


3
분명히 틀렸다. 원하는 곳에서 performSegueWithIdentifier를 호출하십시오.
smileBot

뷰가로드되는 즉시 풀기 segue를 수행하지 않습니까? 예를 들어 버튼을 누른 후 원하는 때 수행하는 대신.
Pahnev

@Pahnev 예. 이 답변이 어떻게 공감을 얻었는지 모르겠습니다. 호출 performSegueWithIdentfier은 정확히 수행합니다 : 한 ViewController에서 다른 ViewController로 segue 수행
ezcoding

완전히 틀렸다. 시작하자마자 되감습니다.
Lee Probert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.