2011-06-01 90 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

相关问题