Gezinme yığınındaki üçüncü görünüme tekrar ilk görünüme geçmek istiyorum.
Tek seferde bir görünümü nasıl açacağımı biliyorum:
[self.navigationController popViewControllerAnimated:YES];
Ama aynı anda nasıl iki tane yaparım?
Gezinme yığınındaki üçüncü görünüme tekrar ilk görünüme geçmek istiyorum.
Tek seferde bir görünümü nasıl açacağımı biliyorum:
[self.navigationController popViewControllerAnimated:YES];
Ama aynı anda nasıl iki tane yaparım?
Yanıtlar:
Bunu gezinme denetleyicisi yığını arasında da Atlamak için deneyebilirsiniz.
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
İşte UINavigationControllersorununuzu çözebilecek iki uzantı. UIViewControllerBelirli bir sınıfa giren ilkini kullanmanızı tavsiye ederim :
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)
}
}
}
ve şu şekilde kullanın:
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)
// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
removeLastsadece ile değiştirebilirsiniz removeLast(2).
let vc = viewControllers[viewControllers.count - viewsToPop + 1], doğru çalışması için onu şu şekilde değiştirmeniz gerekiyor: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]veyalet vc = viewControllers[viewControllers.count - viewsToPop - 1]
Aşağıdakilerle "kök" (ilk) görünüm denetleyicisine geçebilirsiniz popToRootViewControllerAnimated:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationControllerReferans :
Kök görünüm denetleyicisi dışında yığındaki tüm görünüm denetleyicilerini açar ve ekranı günceller.
Dönüş Değeri
Yığından çıkarılan bir görünüm denetleyicileri dizisi.
Hızlı 2 - xCode 7.3
Bu, UIViewControllers'ı açmak için çok kullanışlı bir uzantı olabilir:
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")
}
}
}
Eğer rootViewController (yol) 'daha derin' olduğu için 2'yi aynı anda açmak istiyorsanız, 2, örneğin UIviewController'a bir kategori eklemeyi düşünebilirsiniz:
#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
Kategoriyi #import "UINavigationController+popTwice.h"uygulamanızda bir yere aktarın ve bu kod satırını aynı anda 2 denetleyiciyi açmak için kullanın:
[self.navigationController popTwoViewControllersAnimated:YES];
harika değil mi? :)
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)
}
}
Sonra Bu Yöntemi Kullanın
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];
Swift 3'te , gezinme denetleyicisinden bir, iki veya daha fazla görüntü denetleyicisini şu şekilde açabilirsiniz
let viewControllers = self.navigationController!.viewControllers as [UIViewController]
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Burada FromWhereYouWantToGoController, hedef denetleyicidir. Umarım yardımcı olur.
Bu cevabı burada görmedim. Yalnızca birkaçını açmak istiyorsanız (köke kadar değil), sınıf türlerini kontrol eden self.navigationController.viewControllers aracılığıyla yineleme yapabilirsiniz veya bir referansınız varsa bunu kullanın:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
X ViewControllers'e geri dönmek için kullandığım küçük bir işlev:
-(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) itibarıyla iki veya daha fazla patlama yapan Swift Sürümü
var viewControllers = self.navigationController?.viewControllers
viewControllers?.removeLast()
viewControllers?.removeLast()
self.navigationController?.setViewControllers(viewControllers, animated: true)
veya
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 yığınını kullanabilirsiniz. 1. Yığındaki tüm viewControllers dizisini getir. 2. Tüm diziyi yineleyin
ve sınıf türünü eşleştirerek istenen viewController'ı bulun . 3. viewController'ı açın.
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)
}
}
}
Basit bir UINavigationController uzantısı kullanarak :
extension UINavigationController {
func popViewControllers(_ count: Int) {
guard viewControllers.count > count else { return }
popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
}
}