2011-08-20 2 views
9

Je les éléments suivants dans un dispositif de commande d'affichage (où webView est une variable d'instance de type UIWebView):Accès self.view.frame en loadview provoque EXC_BAD_ACCESS accident

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

La première ligne, l'attribution de la vue Web, provoque un accident - je reçois EXC_BAD_ACCESS et un message dans la console:

Avertissement: Impossible de restaurer cadre sélectionné précédemment

Je ne comprends pas ce qui cause le crash; self.view.frame est certainement un CGRect.

+2

Vous feriez mieux de toujours fournir le journal des pannes. C'est difficile à dire sans ça. – Anton

+0

La console indique "avertissement: Impossible de restaurer le cadre précédemment sélectionné." et la ligne de code qui a alloué l'UIWebView est surlignée en vert et dit "EXC_BAD_ACCESS". – Tom

Répondre

6

Puisque vous utilisez la méthode loadView, vous devez créer manuellement votre propre hiérarchie de vues. Étant donné que UIWebView est une sous-classe de UIView vous pouvez simplement écrire votre méthode de loadview comme ceci:

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

Ou vous pouvez sauter en utilisant loadview et juste le placer dans la méthode viewDidLoad comme ceci:

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

Pour plus expliquer pourquoi votre application plante, quand un UIViewController est instancié, sa vue n'est pas créée correctement. C'est ce qu'on appelle le chargement paresseux, donc vous essayez d'accéder à une valeur qui n'existe pas encore.

+0

ne pas oublier la version pour webView – progrmr

+0

merci @progrmr. – ms83

+0

Merci, cela rend les choses beaucoup plus claires. – Tom

6

Vous ne pouvez pas utiliser self.viewaccesseur à l'intérieur de loadView, vous ne pouvez utiliser que le setter. La raison en est que la méthode d'accesseur view dans un UIViewController charge la vue (si elle n'est pas déjà chargée) et puisque vous êtes déjà dans loadView (chargement de la vue) cela provoquera une boucle récursive infinie.

Si vous suivez le modèle pour loadview from this answer vous voulez le faire comme ceci:

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

Je pense que le self.view.frame n'existe pas quand loadView est appelé. Vous pouvez mettre ce code dans viewDidLoad, où le self.view est chargé et le cadre connu.

1

Vous essayez d'accéder au cadre de la vue sans même créer la vue. Vous pouvez créer une vue et l'affecter comme self.view ou vous pouvez simplement appeler [super loadView]. Essayez le code ci-dessous.

- (void)loadView { 

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

Les documents recommandent de ne pas appeler super –

+0

@Brad Thomas, Vraiment? Je ne pense pas. – EmptyStack

+0

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

Questions connexes