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?
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?
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];
}
}
Berikut dua UINavigationControllerekstensi yang dapat menyelesaikan masalah Anda. Saya akan merekomendasikan menggunakan yang pertama yang muncul ke UIViewControllerkelas 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)
removeLastdengan file removeLast(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];
UINavigationControllerReferensi :
Munculkan semua pengontrol tampilan di tumpukan kecuali pengontrol tampilan root dan memperbarui tampilan.
Return Value
Array pengontrol tampilan yang muncul dari tumpukan.
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 1 -> Anda dapat meneruskan indeks mana pun yang ingin Anda buka
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")
}
}
}
Jika Anda hanya ingin memunculkan 2 sekaligus karena rootViewController Anda (cara) 'lebih dalam' maka 2 Anda dapat mempertimbangkan untuk menambahkan kategori ke UIviewController misalnya:
#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
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? :)
Cepat 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)
}
}
Kemudian Gunakan Metode Ini
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];
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.
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];
}
}
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];
}
}
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)
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)
}
}
}
Menggunakan ekstensi UINavigationController sederhana :
extension UINavigationController {
func popViewControllers(_ count: Int) {
guard viewControllers.count > count else { return }
popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
}
}