ฉันต้องการปรากฏในมุมมองที่สามบนสแต็กการนำทางกลับไปที่มุมมองแรก
ฉันรู้วิธีแสดงหนึ่งมุมมองพร้อมกัน:
[self.navigationController popViewControllerAnimated:YES];
แต่ฉันจะทำสองอย่างพร้อมกันได้อย่างไร?
ฉันต้องการปรากฏในมุมมองที่สามบนสแต็กการนำทางกลับไปที่มุมมองแรก
ฉันรู้วิธีแสดงหนึ่งมุมมองพร้อมกัน:
[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)
removeLast
ด้วยเพียงremoveLast(2)
.
let vc = viewControllers[viewControllers.count - viewsToPop + 1]
เพื่อให้ทำงานได้อย่างถูกต้องคุณต้องแทนที่ด้วย: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
หรือlet vc = viewControllers[viewControllers.count - viewsToPop - 1]
คุณสามารถไปที่ตัวควบคุมมุมมอง "root" (ตัวแรก) ด้วยpopToRootViewControllerAnimated
:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
อ้างอิง :
แสดงตัวควบคุมมุมมองทั้งหมดบนสแต็กยกเว้นตัวควบคุมมุมมองรูทและอัปเดตการแสดงผล
Return Value
อาร์เรย์ของตัวควบคุมมุมมองที่ดึงมาจากสแตก
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 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")
}
}
}
หากคุณต้องการป๊อป 2 พร้อมกันเนื่องจาก rootViewController ของคุณ (ทาง) 'ลึกกว่า' ดังนั้น 2 คุณสามารถพิจารณาเพิ่มหมวดหมู่ให้กับ UIviewController ได้เช่น:
#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
นำเข้าหมวดหมู่#import "UINavigationController+popTwice.h"
ใดที่หนึ่งในการใช้งานของคุณและใช้บรรทัดของโค้ดนี้เพื่อเปิดตัวควบคุม 2 ตัวพร้อมกัน:
[self.navigationController popTwoViewControllersAnimated:YES];
ไม่ดีเหรอ? :)
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)
}
}
จากนั้นใช้วิธีนี้
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)
}
}
ที่นี่ FromWhereYouWantToGoController คือตัวควบคุมปลายทาง หวังว่าจะช่วยได้
คุณสามารถส่งตัวควบคุมมุมมองเริ่มต้น (ตัวควบคุมที่คุณต้องการกลับมา) จากนั้นเรียกบรรทัดนี้ในมุมมองสุดท้าย:
[self.navigationController popToViewController:yourInitialViewController animated:YES];
ล.
ฉันไม่เห็นคำตอบนี้ที่นี่ หากคุณต้องการป๊อปอัพเพียงไม่กี่รายการ (ไม่ใช่ทั้งหมดไปที่รูท) คุณสามารถทำซ้ำผ่าน self.navigationController.viewControllers เพื่อตรวจสอบประเภทคลาสหรือหากคุณมีการอ้างอิงให้ใช้:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
คุณสามารถกลับไปที่ตัวควบคุมมุมมองรูท
[self.navigationController popToRootViewControllerAnimated:YES];
หรือหากมุมมองที่คุณต้องการให้ปรากฏไม่ใช่มุมมองแรกคุณจะต้องปรากฏขึ้นอีกครั้งในมุมมองก่อนหน้านี้
นี่คือฟังก์ชั่นเล็กน้อยที่ฉันใช้เพื่อย้อนกลับ 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];
}
}
เวอร์ชัน Swift ณ (Swift 1.2 / Xcode 6.3.1) ของ popping สองครั้งขึ้นไป
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)
คุณสามารถใช้สแต็กของ UIViewControllers 1. ดึงอาร์เรย์ของ viewControllers ทั้งหมดในสแต็ก 2. วนซ้ำอาร์เรย์ทั้งหมดและค้นหา viewController ที่ต้องการ
โดยจับคู่ประเภทคลาส 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)
}
}