programing

탐색 컨트롤러에서 두 개의 보기를 동시에 팝업하려면 어떻게 해야 합니까?

magicmemo 2023. 8. 14. 22:46
반응형

탐색 컨트롤러에서 두 개의 보기를 동시에 팝업하려면 어떻게 해야 합니까?

탐색 스택의 세 번째 보기로 팝업하여 첫 번째 보기로 되돌리려고 합니다.

한 번에 하나의 보기를 팝업하는 방법을 알고 있습니다.

[self.navigationController popViewControllerAnimated:YES];

그런데 두 개를 동시에 하려면 어떻게 해야 하나요?

내비게이션 컨트롤러 스택 사이로 이동할 수도 있습니다.

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}

여기 두 개 있습니다.UINavigationController문제를 해결할 수 있는 확장 기능.저는 첫 번째로 나타나는 것을 사용하는 것을 추천합니다.UIViewController특정 클래스의 경우:

extension UINavigationController {

  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
      popToViewController(vc, animated: animated)
    }
  }

  func popViewControllers(viewsToPop: Int, animated: Bool = true) {
    if viewControllers.count > viewsToPop {
      let vc = viewControllers[viewControllers.count - viewsToPop - 1]
      popToViewController(vc, animated: animated)
    }
  }

}

다음과 같이 사용합니다.

// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)

다음을 사용하여 "루트"(첫 번째) 보기 컨트롤러로 이동할 수 있습니다.popToRootViewControllerAnimated:

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];

UINavigationController 참조:

루트 뷰 컨트롤러를 제외한 스택의 모든 뷰 컨트롤러를 팝업하고 디스플레이를 업데이트합니다.

반환 값
스택에서 팝업되는 뷰 컨트롤러의 배열입니다.

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

객체At인덱스:1 --> 팝업할 인덱스를 전달할 수 있습니다.

Swift 2 - xCode 7.3

이것은 팝업 UIViewControllers에 매우 유용한 확장입니다.

extension UINavigationController {

    func popToViewControllerOfType(classForCoder: AnyClass) {
        for controller in viewControllers {
            if controller.classForCoder == classForCoder {
                popToViewController(controller, animated: true)
                break
            }
        }
    }

    func popViewControllers(controllersToPop: Int, animated: Bool) {
        if viewControllers.count > controllersToPop {
            popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
        } else {
            print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
        }
    }
}

rootViewController가 (방향) '깊이'이기 때문에 2를 한 번에 팝업하고 싶다면 2를 UIViewController에 카테고리를 추가하는 것을 고려해 볼 수 있습니다. 예를 들어 다음과 같습니다.

UINavigation Controller+팝업 Twice.h

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

UI 내비게이션 컨트롤러+팝업 Twice.m

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}

@end

범주 가져오기#import "UINavigationController+popTwice.h"다음 코드 라인을 사용하여 컨트롤러 2개를 한 번에 팝합니다.

[self.navigationController popTwoViewControllersAnimated:YES];

대단하지 않나요? :)

스위프트 4:

func popViewControllerss(popViews: Int, animated: Bool = true) {
    if self.navigationController!.viewControllers.count > popViews
    {
        let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
         self.navigationController?.popToViewController(vc, animated: animated)
    }
}

그런 다음 이 방법 사용

self.popViewControllerss(popViews: 2)

이것도 사용할 수 있습니다 :-

[self.navigationController popToViewController:yourViewController animated:YES];
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;

// **[viewControllers objectAtIndex: *put here your viewindex number*]

NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];
    NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    [newStack removeLastObject];
    [newStack removeLastObject];
    [self.navigationController setViewControllers:newStack animated:YES];

Swift 3에서는 내비게이션 컨트롤러에서 하나, 둘 또는 그 이상의 뷰 컨트롤러를 팝업할 수 있습니다.

let viewControllers = self.navigationController!.viewControllers as [UIViewController]
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }

HereFromYouWantToGo 컨트롤러는 대상 컨트롤러입니다.도움이 되길 바랍니다.

초기 보기 컨트롤러(돌아오려는 컨트롤러)를 통과한 다음 마지막 보기에서 다음 행을 호출할 수 있습니다.

[self.navigationController popToViewController:yourInitialViewController animated:YES];

l.

저는 여기서 이 답을 보지 못했습니다.소수만(루트 전체가 아님) 팝업하려면 self.navigationController.viewController를 통해 클래스 유형을 확인하거나 참조가 있는 경우 다음을 사용합니다.

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}

루트 뷰 컨트롤러로 다시 팝업할 수 있습니다.

[self.navigationController popToRootViewControllerAnimated:YES];

또는 팝업할 보기가 첫 번째 보기가 아닌 경우 이전 보기의 보기에서 다시 팝업해야 합니다.

X View 컨트롤러로 돌아가기 위해 사용하는 작은 기능은 다음과 같습니다.

-(void)backMultiple:(id)data {
    int back = 2; //Default to go back 2 
    int count = [self.navigationController.viewControllers count];

    if(data[@"count"]) back = [data[@"count"] intValue];

    //If we want to go back more than those that actually exist, just go to the root
    if(back+1 > count) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    //Otherwise go back X ViewControllers 
    else {
        [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
    }
}

(Swift 1.2 / Xcode 6.3.1) 기준으로 2회 이상 팝핑이 발생

 var viewControllers = self.navigationController?.viewControllers
 viewControllers?.removeLast()
 viewControllers?.removeLast()
 self.navigationController?.setViewControllers(viewControllers, animated: true)

또는

 var viewControllers = self.navigationController?.viewControllers
 var viewsToPop = 2
 var end = (viewControllers?.count)!
 var start = end - viewsToPop
 viewControllers?.removeRange(Range<Int>(start: start, end: end))
 self.navigationController?.setViewControllers(viewControllers, animated: true)

UIViewController 스택할있다니습수용사을▁1. 2.스택의 모든 viewController 배열을 가져옵니다. 2.전체 배열을 반복하고 원하는 보기를 찾습니다. 컨트롤러
클래스 유형을 일치시킵니다. 3. viewController를 엽니다.

func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
        for viewController:UIViewController in viewControllers
        {
            if viewController.isKind(of: WelcomeViewC.self)
            {
                _ = self.navigationController?.popToViewController(viewController, animated: true)
            }
        }
}

간단한 UINavigationController 확장 사용:

extension UINavigationController {
    func popViewControllers(_ count: Int) {
        guard viewControllers.count > count else { return }
        popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
    }
}

언급URL : https://stackoverflow.com/questions/8236940/how-do-i-pop-two-views-at-once-from-a-navigation-controller

반응형