2011-06-01 87 views
2

我想要創建一個自定義的應用內瀏覽器,將其顯示在我的應用程序中。爲什麼我的應用內瀏覽器未加載?

我的建築看起來是這樣的: 子類的UIViewController:uiviewcon 從它的筆尖加載:

  • UIWebView的
  • 頂部,並與像前,後的UI元素下吧,...

我已經實例化後uiviewcon我打電話就可以了以下方法:

-(void)loadrequest:(NSURLRequest *)urlrequest{ 
    [webView loadRequest:urlrequest]; 
} 

webview是一個IBOutlet到我的筆尖的UIWebView。然而,似乎webView是零(我檢查如果(網絡視頻...),我已經明確連接它在IB)

什麼是可能的原因,我的webView不被分離?我已經在uiviewcon中實現了UIWebViewDelegate協議的一些方法(將uiviewcon的viewDidLoad中的self設置爲delegate),但這些方法都沒有被調用(因爲webView爲零,所以看起來很合理)。

我該如何改進我的代碼,以便我的瀏覽器最終加載一些東西?

編輯:我uiviewcon頭:

@protocol CustomWebViewDelegate 
-(void)hidecustomwebview; 
@end 

@interface CustomWebView : UIViewController<UIWebViewDelegate> { 
    UIActivityIndicatorView *spinner; 
    UIWebView *webView; 
} 
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *spinner; 
@property (nonatomic, retain) IBOutlet UIWebView *webView; 
@property (nonatomic,assign) id <CustomWebViewDelegate>delegate; 
-(void)webViewDidStartLoad:(UIWebView *)webView; 
-(void)webViewDidFinishLoad:(UIWebView *)webView; 
-(void)loadrequest:(NSURLRequest *) urlrequest; 
-(IBAction)hideme; 
@end 

回答

3

只有在需要時纔會實例化您的視圖元素。這意味着第一次引用控制器的view屬性(從UIKit內部引用或在代碼中的任何位置引用'self.view')會觸發實際創建您的筆尖中所有元素的過程。

因此,直到上述過程發生,您的webView屬性將爲零。在實例化視圖之前,最有可能調用loadRequest。您的問題的解決方案將僅在調用loadRequest時進行更改。

那麼調用loadRequest的正確時間是什麼?有三種可能性:

1)如果您是從內部CustomWebView調用的loadRequest,你可以把這些代碼在viewDidLoad

2)如果你不得不從CustomWebView外來電的loadRequest,你可以等待第一(例如使用presentModalViewController:animated:或將控制器推到導航堆棧上),然後調用loadRequest。

所以,你的代碼可能看起來是這樣的:

NSURLRequest *someRequest = nil; //Assume this has some valid value 

CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties 
[self presentModalViewController:myWebView]; 
[myWebView loadRequest:someRequest];      //View has been created, 
                 //loadRequest will work. 

,而不是什麼可能原來一直:

NSURLRequest *someRequest = nil; //Assume this has some valid value 

CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties 
[myWebView loadRequest:someRequest];      //Your view is not created yet, loadRequest won't work. 
[self presentModalViewController:myWebView];    

3)如果你不能做到以上,並且必須能夠調用loadRequest在任何時間點,無論你選擇presentModalViewController還是pushViewController,總有一天可以省事:)

hack being,j在你的CustomWebView的init方法中,你指的是self.view,你可以確信視圖已經在'init'後面設置好了。無論你如何參考self.view,甚至像[self.view setNeedsLayout]都可以。就像我說的那樣,沒關係。

這是一個相當簡單的問題,但我想到了這裏所有的選項,因爲這是我以前犯的一個相當常見的錯誤。

+0

完美!非常感謝 :) – Julian 2011-06-01 12:06:48

1

您已連接的UIWebView控件到webView的出口在界面生成器窗口?如果沒有看到this page如何操作。

您在撥打loadRequest方法時也應該小心。一個安全的地方是viewDidLoad方法,你可以保證IBOutlet是有線的。

+0

我從來沒有聽說過在IB中叫做'widget'。不過,我已將UIWebView從筆尖連接到我的uiviewcon的IBOutlet。這回答了你的問題了嗎?我有點困惑與術語小部件我必須承認:P謝謝你的回答! :) – Julian 2011-06-01 09:21:06

+0

是的,這就是我的意思。你什麼時候調用'loadrequest'方法? – 2011-06-01 09:39:08

+0

在alloc啓動之後立即執行。嗯,從你所說的那些看來是錯誤的。你會如何建議我告訴我的uiviewcon告訴webView加載某個NSURLRequest? – Julian 2011-06-01 09:43:02

相關問題