App Browser not loading?
我想创建一个自定义的应用内浏览器来显示它在我的应用程序内。
我的架构看起来像这样:UIViewController的子类:从它的笔尖加载的uiviewcon:
在我实例化了uiviewcon之后,我对它调用了以下方法:
-(void)loadrequest:(NSURLRequest *)urlrequest{
[webView loadRequest:urlrequest];
}
webview是我的笔尖中的UIWebView的IBOutlet。 然而,似乎webView是零(我通过if(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
您的视图元素仅在需要时才实例化。 这意味着对控制器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)如果你不能完成上述操作,并且无论何时选择呈现presentModalViewController
或pushViewController
,都可以在任何时间点调用loadRequest,总有一天可以保存:)
hack是,只需在你的CustomWebView的init方法中引用self.view
,你就可以确信视图已经在'init'后面设置好了。 不管你如何引用self.view
,甚至像[self.view setNeedsLayout]
这样的东西都可以。 就像我说的那样,没关系。
这是一个相当简单的问题,但我想在这里列出所有的选项,因为这是我以前犯的一个相当常见的错误。
您是否已将UIWebView小部件连接到Interface Builder窗口中的webView插座? 如果没有看到这个页面如何做到这一点。
当您调用loadRequest
方法时,您还应该小心。 一个安全的地方是viewDidLoad
方法,你可以保证IBOutlet是有线的。