2011-08-20 70 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 –