¿Puedo hacer que ViewController específico?
-
26-09-2019 - |
Pregunta
Estoy utilizando la aplicación basada en la navegación. Empujo Primera ViewController a Segunda ViewController y desde la segunda a la tercera ViewController ViewController. Ahora quiero hacer estallar de Tercera a Primera ViewController ViewController.I estoy realizando esta tarea mediante el siguiente código, pero mi solicitud se estrelló.
Por favor, dame cualquier órgano algunas pautas adecuadas. No puedo usar el pop a RootViewController porque es diferente viewController. Gracias de antemano ...
En tercer lugar ViewControler he escrito esto:
FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
Solución
Al escribir la primera línea a obtener los índices de todos los controladores de Vista y de segunda línea Va a llegar hasta su destino.
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
Otros consejos
Un enfoque más seguro:
- (void)turnBackToAnOldViewController{
for (UIViewController *controller in self.navigationController.viewControllers) {
//Do not forget to import AnOldViewController.h
if ([controller isKindOfClass:[AnOldViewController class]]) {
[self.navigationController popToViewController:controller
animated:YES];
return;
}
}
}
Swifty manera:
let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
navigationController!.popToViewController(dashboardVC, animated: true)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
A menudo es más importante hacerlo desde la parte superior de la pila, así:
- (void)popToLast:(Class)aClass
{
for (int i=self.navigationController.viewControllers.count-1; i>=0; i--)
{
UIViewController *vc = self.navigationController.viewControllers[i];
if ([vc isKindOfClass:aClass])
{
[self.navigationController popToViewController:vc animated:YES];
break;
}
}
}
y se llama ese
popToLast:[SomeViewController class];
- (void) RetunToSpecificViewController{
for (UIViewController *controller in self.navigationController.viewControllers)
{
if ([controller isKindOfClass:[AnOldViewController class]])
{
//Do not forget to import AnOldViewController.h
[self.navigationController popToViewController:controller
animated:YES];
break;
}
}
}
rápida y segura Swift 3 Versión:
if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
navigationController.popToViewController(vc, animated: true)
}
Su código crea una nueva instancia de una visión que nunca se ha llevado a la pila, luego trata de hacer estallar de nuevo a ese controlador.
Si están apareciendo de nuevo al controlador de vista raíz, puede usos popToRootViewControllerAnimated:
Si está viniendo rápidamente una distancia conocida puede llamar popViewControllerAnimated:
más de una vez. En su ejemplo, que sería 2 controladores por así llamadas. Se podría hacer lo mismo mirando en viewControllers
para el controlador 2 del final y hacer estallar a la misma.
Las sugerencias anteriores son soluciones rápidas. Una práctica mejor escenario sería pasar el controlador que desea devolver a lo largo de cada controlador sucesiva se presiona. En primer lugar se hace pasar a segundo, segundo pasa que la referencia a terceros terceros pops, a la referencia pasado, que es primero.
En efecto, se está creando un controlador de raíz temporal. Usted podría subclase UINavigationController
y añadir una propiedad temporaryRoot
y un método popToTemporaryRootViewControllerAnimated:
que el pop a la raíz temporal y desactivarla. Cuando primeros empujones segundos, sino que también pondrían a sí misma como la raíz temporal para que todos los controladores de la pila no tiene que pasar una referencia alrededor. Usted tendría que añadir algunas comprobaciones adicionales para no está seguro que nunca más allá del pop temporaryRoot sin borrarlo.
Después de mucho esfuerzo que alguien ha creado la extensión rápida de volver a un controlador de vista particular en Swift 3.0.
extension UINavigationController {
func backToViewController(viewController: Swift.AnyClass) {
for element in viewControllers as Array {
if element.isKind(of: viewController) {
self.popToViewController(element, animated: true)
break
}
}
}
}
método de llamada:
self.navigationController?.backToViewController(viewController: YourViewController.self)
aplicado y probado en Swift 3.0
A continuación se muestra un método que puede útil para navegar a cualquier específica Vista Controlador:
func poptoSpecificVC(viewController : Swift.AnyClass){
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController.isKind(of: viewController) {
self.navigationController!.popToViewController(aViewController, animated: true)
break;
}
}
}
Uso:
self.poptoSpecificVC(viewController: createIntervalVC.self)
creo que .filter({...}).first
es un poco más lento que .first(where: {...})
.
También esto podría escribirse con mayor precisión a la dirección sólo UIViewControllers.
extension UINavigationController {
func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) {
if let vc = viewControllers.first(where: { $0 is T }) {
popToViewController(vc, animated: animated)
}
}
func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) {
if let vc = viewControllers.first(where: { $0 is T }) {
popToViewController(vc, animated: animated)
} else {
popToRootViewController(animated: animated)
}
}
}
Actualización de Swift 3:
utiliza a continuación código simple, para el estallido de controlador de vista específico;
for vc in self.navigationController!.viewControllers as Array {
if vc.isKind(of: YourViewControllerName) {
self.navigationController!.popToViewController(vc, animated: true)
break
}
}
Swift 4 versión
if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
navigationController?.popToViewController(viewController, animated: false)
}
Se puede especificar otro filtro en .viewControllers.first
según su necesidad por ejemplo digamos que si tiene misma kind
de los controladores de vista que residen en el controlador de navegación a continuación, se puede especificar una comprobación adicional, como a continuación
if let viewController = navigationController?.viewControllers.first(where: {
if let current = $0 as? YourViewController {
return current.someProperty == "SOME VALUE"
}
return false } ) {
navigationController?.popToViewController(viewController, animated: false)
}
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: LoginVC.self) {
_ = self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Función Poner en UIViewController
1. comprueba si existe UIViewController
específico en UINavigationController
entonces popToViewController
o pushViewController
otro
func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
for obj in self.navigationController!.viewControllers {
if obj.isMember(of: navVC) {
self.navigationController!.popToViewController(obj, animated: true)
return
}
}
self.navigationController!.pushViewController(pushVC, animated: true)
}
Uso
self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)
He aquí la respuesta. Este es el código de trabajo del 100% para Swift> 4.X
¿Cómo puedo hacer estallar Vista Controlador específica en Swift