eliminar 2 subvistas de una vez

Estoy tratando de eliminar dos controladores de vista (que se han agregado uno encima del otro) con un método. He creado las vistas en interfacebuilder. todos tienen sus propios archivos .hy .m para acompañarlos.

Escenario en el que estoy:

Tengo un menú principal que tiene el archivo de encabezado view2 importado. En un método, agrego la segunda vista en la parte superior de la supervista así

view2ViewController * view2 = [[view2ViewController alloc] initWithNibName:@"view2ViewController" bundle:nil];
[self.view addSubview:view2.view];

luego, en la vista 2, he agregado el archivo de encabezado de la vista 3 para poder agregar la vista 3 como una subvista en la parte superior de la vista 2. Tengo otro método que está conectado nuevamente al constructor de interfaces a un UIButton, por lo que al presionar el botón, se llama a un método en view2 que agrega la vista 3 en la parte superior exactamente de la misma manera:

view3ViewController * view3 = [[view3ViewController alloc] initWithNibName:@"view3ViewController" bundle:nil];
[self.view addSubview:view3.view];

Lo que estoy tratando de resolver: Tengo un botón en la vista 3 que debería eliminar la vista 3 ... y luego también debería eliminar la vista 2 para que la pantalla principal sea visible.

¿Cómo se puede lograr esto?

Lo que tengo hasta ahora:

[self.view removeFromSuperview];

Sin embargo, esto solo elimina la Vista 3 ... pero deja la Vista 2 en su lugar.

¿Qué se debe modificar para que también pueda eliminar la vista 2?

Cualquier ayuda se agradece.

preguntado el 08 de enero de 11 a las 15:01

¿Es view3 una subvista de view2 o la vista de la pantalla principal? -

la vista 3 es una subvista que ha sido agregada por view2 -

por lo que la vista principal agrega la vista dos como una subvista ... luego la vista dos agrega la vista 3 como una subvista. ¡He estado trabajando en esto todo el día! y todavía lo soy. SI tiene alguna sugerencia, será útil -

Entonces, ¿estás diciendo que si uso algo como [self.view removeFromSuperView] esto solo elimina la vista? y no sus subvistas (es decir, todos los elementos como UIButton y así sucesivamente que están contenidos dentro de la vista) ??? -

Solo la vista. Pero no eres responsable de publicar el contenido eliminado. subviews array (a menos que tenga una propiedad adicional), su método dealloc incorporado debería encargarse de eso. tl; dr: Solo llamar a removeFromSuperview está bien. :) -

3 Respuestas

Normalmente haría esto agregando view2 y view3 como subvistas de la vista principal. Luego, cuando se activan las acciones del botón, el controlador de vista de la vista principal ejecutará la adición y eliminación de subvistas.

Para un truco rápido, creo que puedes probar esto en tu controlador de botones.

[self.view removeFromSuperview];
[self.view.superview removeFromSuperview];

Aunque no estoy seguro de si deberías hacerlo. :PAG

Respondido el 08 de enero de 11 a las 21:01

esto solo elimina la vista superior. lo cual es genial, pero también me gustaría eliminar view2 que está debajo de la vista superior (view3) - Pavana

¿Qué es extraño si usa la segunda línea ... la vista 2 y la vista 3 ya no son visibles? ¿Todavía están allí? - Pavana

view2 es la supervista de view3, ¿verdad? Pensé que debería funcionar. No puedo probar por mí mismo en este momento, no tengo una Mac cerca. De todos modos, todavía recomiendo mejor la primera parte de mi respuesta. - Altealice

removeFromSuperview los eliminará de su supervista subviews formación. Si los está reteniendo en otro lugar, todavía estarán allí (en la memoria, quiero decir). - Altealice

en realidad estoy tratando de eliminar completamente la vista 2 y la vista 3 ... al presionar el botón en la vista 3. - Pavana

¿Esto es lo que necesitas?

    [[[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

Respondido el 08 de enero de 11 a las 19:01

hola gracias por ayudar. necesito algo que elimine la vista debajo de mi vista actual - Pavana

Estoy tan atrapado en esto. He estado intentando eliminar mi segunda vista de la vista en la que estoy durante un tiempo. ¿Quizás pueda especificar qué vista eliminar? diciendo algo como eliminar SecondViewController? - Pavana

No sé qué estás tratando de hacer exactamente, pero tengo la impresión de que lo que quieres es impulsar un nuevo controlador de vista. Si tiene un UINavigationController en su aplicación, solo tendría que hacer un

[navigationController pushViewController:view2 aimated:YES]

Para volver al menú principal cuando se presiona el botón, debe definir un protocolo de delegado que se parezca a esto:

@protocol View3ViewControllerDelegate
- (void)view3ControllerBackToMainMenuButtonPressed:(View3ViewController*)controller;
@end

Luego, este protocolo es implementado por la clase que realmente empuja a los otros controladores de vista. En la implementación, desplegaría todos los controladores de vista que ya no desea que se muestren. Para hacer esto, podrías usar

[navigationController popToViewController:myMainMenuViewController animated:YES]

o si su controlador de vista del menú principal es en realidad el controlador de vista raíz:

[navigationController [navigationController popToRootViewControllerAnimated:YES]

De esa manera, solo una clase es responsable de presionar y hacer estallar todos los controladores de vista y manejar el botón "Volver al menú principal". El uso de un protocolo personalizado como se describe anteriormente es la forma recomendada de manejar la aparición de controladores de vista presionados en un escenario como este.

Espero que ayude!

Respondido el 08 de enero de 11 a las 21:01

Esto parece una forma adecuada de manejar las vistas en este tipo de situación. Lo único es que no estoy usando un controlador de navegación. ¿Podrías aclarar cuál puede ser la mejor opción para mí? Simplemente tengo la vista principal que agrega subvista: vista2 ... al presionar el botón en la vista principal. Luego tengo un botón en la vista 2 que agrega subvista: vista3. inside view3 tengo otro botón que añade subview: 4. Ahora, en la vista 4, me gustaría deshacerme de la vista 4 y la vista 3 haciendo clic en el botón de la vista 4. En este momento lo estoy haciendo así: [self.view.superview removeFromSuperView]; - Pavana

que se llama en la vista 4 en la acción del botón. que con la ayuda de atlealice he entendido que esto eliminará la vista principal de view4 view3 eliminando la vista 4 también ...... lo único es ... ¿es este el camino a seguir? ¿O puedo implementar algo de lo que sugirió para hacerlo más aceptable? gracias por su paciencia. - Pavana

Esto es más o menos lo mismo que mi sugerencia, solo que este utiliza un controlador de navegación. Supuse que solo está agregando subvistas porque no puede / no desea usar un controlador de navegación. No obstante, el enfoque es el mismo: desde la vista secundaria, llame a un método en la vista principal que lo sacará del controlador de navegación. Le sugiero que evalúe si realmente necesita usar un controlador de navegación, luego decida cuál usar. :) - Altealice

¿Existe una buena razón por la que no usa un UINavigationController? Después de todo, está navegando por diferentes vistas cargadas desde un grupo de XIB administradas por controladores de vista. Manejar esa es la razón por la que existe la clase UINavigationController. Pero si realmente no puede usar uno, supongo que el enfoque de simplemente agregar las vistas como subvistas es una posible manera de hacerlo. Solo recuerde también retener y liberar adecuadamente no solo las vistas, sino también los controladores de vista, implementando así su propia versión de un UINavigationController :) - Marco Masser

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.