2011-07-09 14 views
5

Estoy seguro de que este es un error estúpido, pero estoy tratando durante la última hora para eliminar una subvista de mi superview sin éxito.removeFromSuperview hace que mi aplicación se bloquee

En mi primera vista que estoy teniendo

UIViewController *helpView = [[[UIViewController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease]; 
[self.view addSubview:helpView.view]; 

y luego dentro HelpView tengo un botón que está conectado a un IBAction llamado "closeHelp", que simplemente hace lo siguiente:

- (IBAction) closeHelp{ 
    [self.view removeFromSuperview]; 
} 

Pero esto hace que mi aplicación se cuelgue con EXC_BAS_ACCESS por alguna razón extraña, incluso aquellos que están dentro de la vista de ayuda, es decir, self.view debe apuntar a la subvista correcta.

Wo uld aprecia tu ayuda

Gracias.
Shai.

+0

¿En qué clase tienes '-closeHelp'? ¿Está correctamente cableado en el constructor de interfaz? ¿Ha configurado la clase en HelpView.xib para que sea esa clase? – Eiko

Respuesta

5

Cuando Andreas respondió, intenta eliminar self.view de la vista super/original. Básicamente necesita quitar el helpView de su vista principal.

lo que debe ser

- (IBAction) closeHelp{ 
    [helpView removeFromSuperview]; 
} 

Pero no sé lo que es "HelpView" en el método anterior. Como no tenemos ningún control para eso.

Por lo tanto, nuestro código debería tener el siguiente aspecto.

#define HELP_VIEW_TAG 101 // Give tag of your choice 

HelpView *helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil]; 
helpView.view.tag = HELP_VIEW_TAG; 
[self.view addSubview:helpView.view]; 
[helpView release]; 

- (IBAction) closeHelp{ 
    UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG]; 
    [helpView removeFromSuperview]; 
} 
+0

¡Oye, gracias! intenté hacer esta solución, pero ahora la subvista no se cargará ... (EXC_BAD_ACCESS) UIViewController * helpView = [[[UIViewController alloc] initWithNibName: @ "HelpView" bundle: nil] autorelease]; helpView.view.tag = HELP_VIEW_TAG; [self.view addSubview: helpView.view]; [versión de ayuda]; –

+0

Ok ahora se muestra (hizo algo estúpido con las versiones), pero el botón de cerrar todavía no funcionará ... UIView * helpView = [self.view viewWithTag: 101]; [helpView removeFromSuperview]; (el número de etiqueta estaba codificado por si acaso en el ejemplo) –

+0

Espero que su vista de ayuda se agregue como subvista y se muestre. Me imagino que tienes un botón de cerrar en la vista de ayuda y está vinculado al método de acción en tu código anterior, que debería descartarse, ¿es así? –

2

selfviewer no apunta a su subvista, sino a la vista raíz que administra su controlador uiview. Probablemente debería eliminar solo el último objeto de la pila de subvista, no toda la vista, porque ahora está eliminando toda la vista de ayuda.

De todos modos, ¿por qué no presenta el controlador de vista de forma modal en lugar de hacerlo?

[self presentModalViewController:helpView animated:NO/YES]; 

helpView. modalTransitionStyle = //One of the constants below 

UIModalTransitionStyleCoverVertical 
UIModalTransitionStyleFlipHorizontal 
UIModalTransitionStyleCrossDissolve 
UIModalTransitionStylePartialCurl 

Por lo general escribo self.modalTransitionStyle = // One of the constants en el viewcontroller que será presentado de forma modal, en lugar de difundir el código.

+0

Este método pertenece al HelpViewController de todos modos, y la última oración no tiene ningún significado aquí. Si desea modificar la jerarquía de vista, su vista debe cargarse de todos modos, y self.view es la forma adecuada de referenciar la vista. – Eiko

1

Está inicializando helpView como UIViewController.
Asegúrese de tener #import "HelpView.h" (o lo que sea que se llame al archivo helpView .h) en el archivo .h del controlador de vista donde lo está inicializando.

A continuación, utilice este código:

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

Eso debería arreglarlo.

+0

Está básicamente, en el código, tratando de eliminar self.view de su superview, que probablemente debería ser nil. –

+0

Esta es probablemente la respuesta correcta. – Abizern

-1
Declare the help view on calss level. 

in.h file 

@class HelpView; 
.. 
@interface 
{ 
HelpView *helpView; 
} 
@property(nonatomic,retain)HelpView* helpView; 


In.m file 
#import "HelpView" 
@synthensize helpView; 



now add this Code where you want 

helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil]; 
helpView.view.tag = HELP_VIEW_TAG; 
[self.view addSubview:helpView.view]; 


- (IBAction) closeHelp{ 
    //UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG]; 
    [helpView removeFromSuperview]; 
} 

- (void) dealloc { [liberación HelpView]; }

+0

en el padre dealloc o en el helpview dealloc? Supongo que el padre? –

+0

en .m de este archivo add - (void) dealloc {[helpView versión]} – dark

+0

No tiene mucho sentido agregar delegados para los controladores de vista. Confunde a los principiantes; P – Greg

0

La solución más sencilla para mí fue simplemente definir el propietario del archivo de mi XIB como la misma clase que el controlador principal, lo que significa que el controlador principal controlaría tanto la vista principal como la subvista, lo que facilita mucho más las cosas.:)

Cuestiones relacionadas