Saya ingin memunculkan tampilan ketiga di tumpukan navigasi kembali ke tampilan pertama.
Saya tahu cara memunculkan satu tampilan sekaligus:
[self.navigationController popViewControllerAnimated:YES];
Tapi bagaimana saya melakukan dua sekaligus?
ios
iphone
uinavigationcontroller
Adam Waite
sumber
sumber
Jawaban:
Anda juga dapat mencoba ini untuk Langsung di antara tumpukan pengontrol navigasi
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]]; for (UIViewController *aViewController in allViewControllers) { if ([aViewController isKindOfClass:[RequiredViewController class]]) { [self.navigationController popToViewController:aViewController animated:NO]; } }
sumber
Berikut dua
UINavigationController
ekstensi yang dapat menyelesaikan masalah Anda. Saya akan merekomendasikan menggunakan yang pertama yang muncul keUIViewController
kelas tertentu: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) } } }
dan gunakan seperti ini:
// pop to SomeViewController class navigationController?.popToViewController(ofClass: SomeViewController.self) // pop 2 view controllers navigationController?.popViewControllers(viewsToPop: 2)
sumber
removeLast
dengan fileremoveLast(2)
.let vc = viewControllers[viewControllers.count - viewsToPop + 1]
, untuk bekerja dengan benar Anda perlu menggantinya dengan:let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
ataulet vc = viewControllers[viewControllers.count - viewsToPop - 1]
Anda dapat membuka pengontrol tampilan "root" (pertama) dengan
popToRootViewControllerAnimated
:[self.navigationController popToRootViewControllerAnimated:YES]; // If you want to know what view controllers were popd: // NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
Referensi :sumber
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 1 -> Anda dapat meneruskan indeks mana pun yang ingin Anda buka
sumber
Swift 2 - xCode 7.3
Ini bisa menjadi ekstensi yang sangat berguna untuk memunculkan 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") } } }
sumber
Jika Anda hanya ingin memunculkan 2 sekaligus karena rootViewController Anda (cara) 'lebih dalam' maka 2 Anda dapat mempertimbangkan untuk menambahkan kategori ke UIviewController misalnya:
UINavigationController + popTwice.h
#import <UIKit/UIKit.h> @interface UINavigationController (popTwice) - (void) popTwoViewControllersAnimated:(BOOL)animated; @end
UINavigationController + popTwice.m
#import "UINavigationController+popTwice.h" @implementation UINavigationController (popTwice) - (void) popTwoViewControllersAnimated:(BOOL)animated{ [self popViewControllerAnimated:NO]; [self popViewControllerAnimated:animated]; } @end
Impor kategori
#import "UINavigationController+popTwice.h"
di suatu tempat dalam implementasi Anda dan gunakan baris kode ini untuk memunculkan 2 pengontrol sekaligus:[self.navigationController popTwoViewControllersAnimated:YES];
Bukankah itu bagus? :)
sumber
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) } }
Kemudian Gunakan Metode Ini
self.popViewControllerss(popViews: 2)
sumber
Anda juga dapat mencoba yang ini: -
[self.navigationController popToViewController:yourViewController animated:YES];
sumber
//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];
sumber
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]]; [newStack removeLastObject]; [newStack removeLastObject]; [self.navigationController setViewControllers:newStack animated:YES];
sumber
Di Swift 3 , Anda dapat memunculkan satu, dua atau lebih viewcontrollers dari pengontrol navigasi seperti itu
let viewControllers = self.navigationController!.viewControllers as [UIViewController] for aViewController:UIViewController in viewControllers { if aViewController.isKind(of: FromWhereYouWantToGoController.self) { _ = self.navigationController?.popToViewController(aViewController, animated: true) } }
Di sini FromWhereYouWantToGoController adalah pengontrol tujuan. Semoga membantu.
sumber
Anda dapat meneruskan pengontrol tampilan awal (yang ingin Anda lihat kembali) dan kemudian memanggil baris ini di tampilan terakhir:
[self.navigationController popToViewController:yourInitialViewController animated:YES];
L.
sumber
Saya tidak melihat jawaban ini di sini. Jika Anda hanya ingin memunculkan beberapa (tidak sampai ke root), Anda dapat mengulang melalui self.navigationController.viewControllers untuk memeriksa jenis kelas, atau jika Anda memiliki referensi yang digunakan:
for (UIViewController *aViewController in self.navigationController.viewControllers) { if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) { [self.navigationController popToViewController:aViewController animated:YES]; } }
sumber
Anda dapat kembali ke pengontrol tampilan root
[self.navigationController popToRootViewControllerAnimated:YES];
atau, jika tampilan yang Anda inginkan bukan yang pertama muncul, Anda harus memunculkan lagi di tampilan sebelumnya.
sumber
Ini sedikit fungsi yang saya gunakan untuk kembali ke 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]; } }
sumber
Versi Swift pada (Swift 1.2 / Xcode 6.3.1) muncul dua kali atau lebih
var viewControllers = self.navigationController?.viewControllers viewControllers?.removeLast() viewControllers?.removeLast() self.navigationController?.setViewControllers(viewControllers, animated: true)
atau
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)
sumber
Anda dapat menggunakan tumpukan UIViewControllers. 1. Ambil array dari semua viewControllers di tumpukan. 2. Iterasi melalui seluruh larik dan temukan viewController yang diinginkan
dengan mencocokkan tipe kelas. 3. Munculkan 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) } } }
sumber
Menggunakan ekstensi UINavigationController sederhana :
extension UINavigationController { func popViewControllers(_ count: Int) { guard viewControllers.count > count else { return } popToViewController(viewControllers[viewControllers.count - count - 1], animated: true) } }
sumber