2011-08-20 41 views
9

我已经在视图控制器的以下(其中webViewUIWebView类型的实例变量):在访问的loadView导致self.view.frame EXC_BAD_ACCESS崩溃

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

第一行,分配web视图,导致系统崩溃 - 我得到EXC_BAD_ACCESS并在控制台消息:

警告:无法恢复先前选择的帧

我不明白什么导致崩溃; self.view.frame绝对是CGRect

+2

你最好总是提供崩溃日志。很难说没有它。 – Anton

+0

控制台显示“警告:无法恢复先前选定的框架”。并且分配UIWebView的代码行以绿色突出显示,并显示为“EXC_BAD_ACCESS”。 – Tom

回答

6

由于您使用loadView方法,您必须手动创建您自己的视图层次结构。由于UIWebView的是UIView的子类,你可以只写你的loadView方法是这样的:

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

或者你可以跳过使用的loadView,只是把它放在viewDidLoad方法是这样的:进一步

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

要详细说明为什么你的应用程序崩溃,当一个UIViewController被实例化时,它的视图不是以正确的方式创建的。这被称为延迟加载,因此您正尝试访问尚不存在的值。

+0

不要忘了webView – progrmr

+0

的发布感谢@progrmr。 – ms83

+0

谢谢,这让事情变得更清晰。 – Tom

6

你不能使用self.view访问器里面loadView,你只能使用setter。原因是UIViewController中的访问器方法会加载视图(如果它尚未加载),并且由于您已经在loadView(加载视图)中,它将导致无限递归循环。

如果按照from this answer你会想这样做,这样反而对的loadView模式:

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

我觉得self.view.frameloadView被称为不存在。您可以将该代码放入viewDidLoad,其中self.view已加载并且帧已知。

1

您正尝试访问视图的帧而不创建视图。您可以创建视图并将其分配为self.view,或者您可以简单地拨打[super loadView]。尝试下面的代码。

- (void)loadView { 

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

Docs建议不要致电超级 –

+0

@Brad Thomas,真的吗?我不这么认为。 – EmptyStack

+0

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