2011-08-20 18 views
9

he lo siguiente en un controlador de vista (donde webView es una variable de instancia de tipo UIWebView):Acceso self.view.frame en loadView causa EXC_BAD_ACCESS accidente

- (void)loadView 
{ 
    webView = [[UIWebView alloc]initWithFrame:self.view.frame]; 
    [self.view addSubview:webView]; 
} 

la primera línea, la asignación de la vista web, provoca un accidente - consigo EXC_BAD_ACCESS y un mensaje en la consola:

Advertencia: No se puede restaurar marco seleccionado previamente

No entiendo qué está causando el bloqueo; self.view.frame es definitivamente un CGRect.

+2

Será mejor que proporcione siempre el registro de bloqueo. Es difícil decirlo sin él. – Anton

+0

La consola dice "advertencia: no se puede restaurar el marco seleccionado previamente". y la línea de código que asignó UIWebView se resalta en verde y dice "EXC_BAD_ACCESS". – Tom

Respuesta

6

Dado que está utilizando el método loadView, debe crear manualmente su propia jerarquía de vistas. Desde UIWebView es una subclase de UIView usted podría escribir su método loadView así:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
self.view = webView; 
[webView release]; 

O puede saltar usando loadView y simplemente colocarlo en el método viewDidLoad así:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
[self.view addSubview:webView]; 
[webView release]; 

Para más explique por qué su aplicación se bloquea, cuando se crea una instancia de un UIViewController, su vista no se crea correctamente. Esto se denomina carga diferida, por lo que está intentando acceder a un valor que aún no existe.

+0

no se olvide del lanzamiento para webView – progrmr

+0

gracias @progrmr. – ms83

+0

Gracias esto hace las cosas mucho más claras. – Tom

6

No puede usar self.viewaccessor dentro de loadView, solo puede usar setter. El motivo es que el método de acceso view en un UIViewController carga la vista (si aún no está cargada) y como ya está en loadView (cargando la vista) causará un bucle infinito recursivo.

Si sigue el patrón para loadView from this answer que se desea hacerlo de esta manera en su lugar:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
self.view = webView; 
[webView release]; // don't forget to release 
0

creo que el self.view.frame no existe cuando loadView se llama. Puede poner ese código en viewDidLoad, donde se carga el self.view y se conoce el marco.

1

Está intentando acceder al marco de la vista sin siquiera crear la vista. Puede crear una vista y asignarla como self.view o simplemente puede llamar al [super loadView]. Pruebe el siguiente código.

- (void)loadView { 

    [super loadView]; 
    webView = [[UIWebView alloc] initWithFrame:self.view.frame]; 
    [self.view addSubview:webView]; 
} 
+0

Los documentos recomiendan no llamar a super –

+0

@Brad Thomas, ¿de verdad? No lo creo. – EmptyStack

+0

https://developer.apple.com/library/ios/Documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#jumpTo_61 –

Cuestiones relacionadas