2011-08-20 10 views
9

Ho quanto segue in un controller della vista (dove webView è una variabile di istanza di tipo UIWebView):Accesso self.view.frame in loadview provoca EXC_BAD_ACCESS incidente

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

La prima linea, allocando la vista web, provoca un incidente - ricevo EXC_BAD_ACCESS e un messaggio in console:

Avviso: impossibile ripristinare la struttura selezionata in precedenza

Non capisco cosa causa l'incidente; self.view.frame è sicuramente un CGRect.

+2

È consigliabile fornire sempre il registro degli arresti anomali. È difficile dire che no. – Anton

+0

La console dice "avviso: impossibile ripristinare il frame precedentemente selezionato". e la riga di codice che alloggiava UIWebView è evidenziata in verde e recita "EXC_BAD_ACCESS". – Tom

risposta

6

Poiché si sta utilizzando il metodo loadView, è necessario creare manualmente la propria gerarchia di viste. Dal momento che UIWebView è una sottoclasse di UIView si può solo scrivere il metodo loadview in questo modo:

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

Oppure si potrebbe saltare usando loadview e proprio metterlo nel metodo viewDidLoad in questo modo:

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

Per ulteriori approfondire perché l'applicazione si blocca, quando un UIViewController viene istanziato la sua vista non viene creata correttamente. Questo è chiamato caricamento lento, quindi stai tentando di accedere a un valore che non esiste ancora.

+0

non dimenticare la versione per webView – progrmr

+0

grazie a @progrmr. – ms83

+0

Grazie rende le cose molto più chiare. – Tom

6

Non è possibile utilizzare self.viewaccessor all'interno di loadView, è possibile utilizzare solo il setter. Il motivo è che il metodo di accesso view in un UIViewController carica la vista (se non è già stata caricata) e poiché si è già in loadView (caricando la vista) causerà un loop ricorsivo infinito.

Se si segue il modello per loadview from this answer si vorrebbe fare in questo modo, invece:

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

penso che il self.view.frame non esiste quando loadView si chiama. È possibile inserire tale codice in viewDidLoad, dove viene caricato il numero self.view e il frame è noto.

1

Si sta tentando di accedere al riquadro della vista senza nemmeno creare la vista. È possibile creare una vista e assegnarla come self.view oppure chiamare semplicemente [super loadView]. Prova il codice qui sotto.

- (void)loadView { 

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

I documenti consigliano di chiamare super –

+0

@Brad Thomas, Davvero? Io non la penso così – EmptyStack

+0

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

Problemi correlati