quitar - split view iphone
¿Cómo puedo abrir dos vistas a la vez desde un controlador de navegación? (16)
Quiero pasar a la tercera vista en la pila de navegación de vuelta a la primera vista.
Sé cómo mostrar una vista de una vez:
[self.navigationController popViewControllerAnimated:YES];
¿Pero cómo hago dos a la vez?
Gracias...
Aquí hay una pequeña función que estoy usando para volver a 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];
}
}
No vi esta respuesta aquí. Si solo desea mostrar algunas (no todo el camino hasta la raíz), puede simplemente recorrer iterativo a través de self.navigationController.viewControllers buscando tipos de clases, o si tiene una referencia, use eso:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
Podrías probar algo como esto:
Rápido
var viewControllers = navigationController?.viewControllers
viewControllers?.removeLast(2) // views to pop
navigationController?.setViewControllers(viewControllers!, animated: true)
C objetivo
int viewsToPop = 2;
[self.navigationController popToViewController: self.navigationController.viewControllers[self.navigationController.viewControllers.count-viewsToPop-1] animated:YES];
Puede abrir el controlador de vista "raíz" (primero) con popToRootViewControllerAnimated
:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
Referencia de UINavigationController
:
Muestra todos los controladores de vista en la pila excepto el controlador de vista raíz y actualiza la pantalla.
Valor de retorno
Una matriz de controladores de vista que se extraen de la pila.
Puede pasar el controlador de vista inicial (aquel al que desea volver) y luego llamar a esta línea en la última vista:
[self.navigationController popToViewController:yourInitialViewController animated:YES];
L.
Puedes probar esto para saltar también entre la pila del controlador de navegación
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
Si solo desea mostrar 2 al mismo tiempo porque su controlador raíz es (camino) ''más profundo'', entonces 2 podría considerar agregar una categoría a UIviewController por ejemplo:
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
Importe la categoría #import "UINavigationController+popTwice.h"
en algún lugar de su implementación y use esta línea de código para mostrar 2 controladores a la vez:
[self.navigationController popTwoViewControllersAnimated:YES];
no es tan bueno? :)
Swift 2 - xCode 7.3
Esta podría ser una extensión muy útil para pop 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")
}
}
}
También puedes probar este:
[self.navigationController popToViewController:yourViewController animated:YES];
Versión Swift a partir de (Swift 1.2 / Xcode 6.3.1) de hacer estallar dos o más veces
var viewControllers = self.navigationController?.viewControllers
viewControllers?.removeLast()
viewControllers?.removeLast()
self.navigationController?.setViewControllers(viewControllers, animated: true)
o
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)
puede regresar al controlador de vista raíz
[self.navigationController popToRootViewControllerAnimated:YES];
o, si la vista a la que desea acceder no es la primera, deberá volver a mostrarla en la vista de su vista anterior.
En Swift 3 , puede abrir uno, dos o más viewcontrollers desde el controlador de navegación de esa manera
let viewControllers = self.navigationController!.viewControllers as [UIViewController]
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Aquí FromWhereYouWantToGoController es el controlador de destino. Espero eso ayude.
Puede usar la pila de UIViewControllers. 1. Obtenga la matriz de todos los viewControllers en la pila. 2. Iterate a través de toda la matriz y encuentra la viewController deseada
haciendo coincidir el tipo de clase. 3. Aparece el 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)
}
}
}
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
[newStack removeLastObject];
[newStack removeLastObject];
[self.navigationController setViewControllers:newStack 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];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
objectAtIndex: 1 -> puede pasar el índice que quiera mostrar a