Tôi muốn bật chế độ xem thứ ba trên ngăn xếp điều hướng trở lại chế độ xem đầu tiên.
Tôi biết cách bật một chế độ xem cùng một lúc:
[self.navigationController popViewControllerAnimated:YES];
Nhưng làm thế nào để làm hai cùng một lúc?
Tôi muốn bật chế độ xem thứ ba trên ngăn xếp điều hướng trở lại chế độ xem đầu tiên.
Tôi biết cách bật một chế độ xem cùng một lúc:
[self.navigationController popViewControllerAnimated:YES];
Nhưng làm thế nào để làm hai cùng một lúc?
Câu trả lời:
Bạn có thể thử điều này để Nhảy giữa ngăn xếp bộ điều khiển điều hướng
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
Đây là hai UINavigationController
phần mở rộng có thể giải quyết vấn đề của bạn. Tôi khuyên bạn nên sử dụng cái đầu tiên bật lên một UIViewController
lớp cụ thể:
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)
}
}
}
và sử dụng nó như thế này:
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)
// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
removeLast
bằng chỉ removeLast(2)
.
let vc = viewControllers[viewControllers.count - viewsToPop + 1]
, để làm việc một cách chính xác bạn cần phải thay thế nó với: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
hoặclet vc = viewControllers[viewControllers.count - viewsToPop - 1]
Bạn có thể bật bộ điều khiển chế độ xem "gốc" (đầu tiên) với popToRootViewControllerAnimated
:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
Tham khảo :
Dừng tất cả các bộ điều khiển chế độ xem trên ngăn xếp ngoại trừ bộ điều khiển chế độ xem gốc và cập nhật màn hình.
Giá trị trả lại
Một mảng bộ điều khiển chế độ xem được xuất hiện từ ngăn xếp.
Swift 2 - xCode 7.3
Đây có thể là một tiện ích mở rộng rất hữu ích để bật 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")
}
}
}
Nếu bạn chỉ muốn bật 2 cùng một lúc vì rootViewController của bạn (cách) 'sâu hơn' thì 2 bạn có thể xem xét thêm một danh mục vào UIviewController, ví dụ:
#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated;
@end
#import "UINavigationController+popTwice.h"
@implementation UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated{
[self popViewControllerAnimated:NO];
[self popViewControllerAnimated:animated];
}
@end
Nhập danh mục #import "UINavigationController+popTwice.h"
ở đâu đó trong triển khai của bạn và sử dụng dòng mã này để bật 2 bộ điều khiển cùng một lúc:
[self.navigationController popTwoViewControllersAnimated:YES];
điều đó không tuyệt phải không? :)
Swift 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)
}
}
Sau đó sử dụng phương pháp này
self.popViewControllerss(popViews: 2)
//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];
Trong Swift 3 , bạn có thể bật một, hai hoặc nhiều bộ điều khiển chế độ xem từ bộ điều khiển điều hướng như vậy
let viewControllers = self.navigationController!.viewControllers as [UIViewController]
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Đây FromWhereYouWantToGoController là bộ điều khiển đích. Hy vọng nó giúp.
Tôi không thấy câu trả lời này ở đây. Nếu bạn chỉ muốn bật một vài (không phải tất cả các cách đến thư mục gốc), bạn chỉ có thể lặp lại qua self.navigationController.viewControllers kiểm tra các loại lớp hoặc nếu bạn có tham chiếu, hãy sử dụng:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
Đây là một chức năng nhỏ mà tôi đang sử dụng để quay lại X ViewControllers:
-(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];
}
}
Phiên bản Swift kể từ (Swift 1.2 / Xcode 6.3.1) xuất hiện hai lần trở lên
var viewControllers = self.navigationController?.viewControllers
viewControllers?.removeLast()
viewControllers?.removeLast()
self.navigationController?.setViewControllers(viewControllers, animated: true)
hoặc là
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)
Bạn có thể sử dụng ngăn xếp của UIViewControllers. 1. Tìm nạp mảng của tất cả các viewControllers trong ngăn xếp. 2. Lặp lại toàn bộ mảng và tìm viewController mong muốn
bằng cách khớp với loại lớp. 3. Bật 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)
}
}
}
Sử dụng tiện ích mở rộng UINavigationController đơn giản :
extension UINavigationController {
func popViewControllers(_ count: Int) {
guard viewControllers.count > count else { return }
popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
}
}