탐색 컨트롤러에서 두 개의 보기를 동시에 팝업하려면 어떻게 해야 합니까?
탐색 스택의 세 번째 보기로 팝업하여 첫 번째 보기로 되돌리려고 합니다.
한 번에 하나의 보기를 팝업하는 방법을 알고 있습니다.
[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];
루트 뷰 컨트롤러를 제외한 스택의 모든 뷰 컨트롤러를 팝업하고 디스플레이를 업데이트합니다.
반환 값
스택에서 팝업되는 뷰 컨트롤러의 배열입니다.
[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
'programing' 카테고리의 다른 글
실행할 참조 어셈블리를 로드할 수 없습니다. (0) | 2023.08.14 |
---|---|
Global.asax.cs 파일은 어디에 있습니까? (0) | 2023.08.14 |
jquery, 도메인, URL 가져오기 (0) | 2023.08.14 |
다음은 무엇을 의미합니까:accept-encoding? (0) | 2023.08.14 |
문자열의 두 문자열 사이에 문자열 가져오기 (0) | 2023.08.09 |