code

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

codestyles 2020. 10. 3. 10:44
반응형

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


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

Unwind segues는 스토리 보드의 기존 장면 인스턴스로 전환 할 수 있습니다.

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

unwind segues는 어떻게 작동하며 용도는 무엇입니까?


간단히 말해서

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

unwind segue를 수행 할 때 해제하려는 뷰 컨트롤러의 작업 메서드 인 작업을 지정해야합니다.

목표 -C :

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

빠른:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

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

iOS 8 업데이트 : Unwind segue는 ShowShow Detail같은 iOS 8의 적응 형 segue에서도 작동 합니다.

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

여기에 이미지 설명 입력

Green View Controller에서 Red View Controller로 해제 (뒤로 이동) 할 수 있습니다. Blue에서 Green 또는 Green을 통해 Red로 긴장을 풀 수 있습니다. 풀기를 활성화하려면 빨간색과 녹색에 특수 작업 방법을 추가해야합니다. 예를 들어 다음은 빨간색의 작업 방법입니다.

목표 -C :

@implementation RedViewController

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

@end

빠른:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

액션 메소드가 추가 된 후, 종료 아이콘으로 컨트롤 드래그하여 스토리 보드에서 풀기 세그를 정의 할 수 있습니다. 여기에서 버튼을 눌렀을 때 녹색에서 빨간색으로 되돌리고 싶습니다.

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

또한 파란색에서 빨간색으로 긴장을 풀 수 있습니다 (탐색 스택에서 "2 단계 떨어져"있음). 핵심은 올바른 풀기 동작을 선택하는 것입니다.

unwind segue가 수행되기 전에 action 메서드가 호출됩니다. 예제에서 나는 Green과 Blue에서 Red 로의 unwind segue를 정의했습니다. UIStoryboardSegue 매개 변수를 통해 action 메소드에서 unwind 소스에 액세스 할 수 있습니다.

목표 -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 뷰 컨트롤러를 추가하면 Yellow에서 Red로 다시 한 번에 풀 수 있습니다.

여기에 이미지 설명 입력

코드에서 풀기

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

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

After this, the unwind segue can be performed from code just like any other segue:

Objective-C:

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

Swift:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

As far as how to use unwind segues in StoryBoard...

Step 1)

Go to the code for the view controller that you wish to unwind to and add this:

Objective-C

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

Be sure to also declare this method in your .h file in Obj-C

Swift

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

Step 2)

In storyboard, go to the view that you want to unwind from and simply drag a segue from your button or whatever up to the little orange "EXIT" icon at the top right of your source view.

여기에 이미지 설명 입력

There should now be an option to connect to "- unwindToViewControllerNameHere"

That's it, your segue will unwind when your button is tapped.


Unwind segues are used to "go back" to some view controller from which, through a number of segues, you got to the "current" view controller.

Imagine you have something a MyNavController with A as its root view controller. Now you use a push segue to B. Now the navigation controller has A and B in its viewControllers array, and B is visible. Now you present C modally.

With unwind segues, you could now unwind "back" from C to B (i.e. dismissing the modally presented view controller), basically "undoing" the modal segue. You could even unwind all the way back to the root view controller A, undoing both the modal segue and the push segue.

Unwind segues make it easy to backtrack. For example, before iOS 6, the best practice for dismissing presented view controllers was to set the presenting view controller as the presented view controller’s delegate, then call your custom delegate method, which then dismisses the presentedViewController. Sound cumbersome and complicated? It was. That’s why unwind segues are nice.


Something that I didn't see mentioned in the other answers here is how you deal with unwinding when you don't know where the initial segue originated, which to me is an even more important use case. For example, say you have a help view controller (H) that you display modally from two different view controllers (A and B):

AH
BH

How do you set up the unwind segue so that you go back to the correct view controller? The answer is that you declare an unwind action in A and B with the same name, e.g.:

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

This way, the unwind will find whichever view controller (A or B) initiated the segue and go back to it.

In other words, think of the unwind action as describing where the segue is coming from, rather than where it is going to.


Swift iOS:

Step 1: define this method into your MASTER controller view. in which you want to go back:

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

    println("Called goToSideMenu: unwind action")

}

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

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


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

@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"
            }
            
        }

}
  • Unwind Seague Source View Controller (종료 버튼을 VC의 종료 아이콘에 연결하고 unwindseague에 연결해야합니다.

여기에 이미지 설명 입력

  • Seague Completed 해제-> viewControllerA의 TextLabel이 변경되었습니다.

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/12561735/what-are-unwind-segues-for-and-how-do-you-use-them

반응형